Twitter + C# = problematické spolužitie

Asi pred dvomi týždňami som si z nedostatku lepších činností zmyslel, že idem programovať. Ale keďže môj predchádzajúci projekt (M3K Download Manager) je už takmer hotový, nebolo čo. A tak som si povedal, že skúsim niečo nové.

Už dlhšiu dobu som sa pohrával s myšlienkou napísať jednoduchý program pre Twitter, ale odrádzal ma systém prihlasovania a autorizovania užívateľov – Twitter používa OAuth, ktorý je síce skvelý na integráciu do webových stránok, no pre desktopové aplikácie je dosť nemotorný. Ale čo by človek neskúsil, keď sa nudí, že? A tak som zapol Visual Studio, v browseri otvoril Twitter Developer Portal a pustil som sa do toho.

Nebudem zabiehať do prílišných podrobností, ale Twitter vo svojom API používa také bezpečnostné prvky, že spojazdniť základné funkcie mi trvalo 4 hodiny (aj keď z väčšej časti to bola moja hlúposť – potom som si sám nadával).

Dnes som sa ale dostal k ďalšej funkcii, ktorú som chcel zahrnúť do svojho programu – možnosť aktualizovať svoj Twitter status. Ak má byť táto funkcia spoľahlivá a univerzálna, musí si vedieť poradiť s akýmkoľvek jazykom – či už je to slovenčina s jej diakritikou alebo tradičná čínština. A keďže Twitter API je postavené na HTTP requestoch, všetky netradičné znaky je potrebné nejakým spôsobom zakódovať (konkrétne ide o tzv. URL encoding).

A práve v URL encodingu vznikal problém. Vedel som, že jazyk C# obsahuje funkcie, ktoré URL encoding urobia za mňa (System.Web.HttpUtility.URLEncode() a spol.) a tak som si myslel, že je všetko v poriadku. Napísal som funkciu a pustil som sa do testovania. A Twitter mi vytrvalo vracal chybové hlášky.

Pustil som sa teda do pátrania a obrátil som sa na Twitter Developer Portal. Po chvíli som si všimol, že príklad uvedený na Twitteri je zakódovaný ináč, ako to vyzerá v mojom programe. Vysvitlo, že kým C# nahradzuje pri URL encodingu medzeru znamienkom plus, Twitter API vyžaduje, aby boli medzery kódované ako “%20”. A rozdielom nebol koniec.

Po chvíli som objavil aj znaky, ktoré C# necháva v pôvodnej podobe a Twitter ich vyžaduje zakódované: obe okrúhle zátvorky [ ( , ) ], znak dolára [ $ ], zviezdička [ * ], výkričník [ ! ] a apostrof [ ‘ ]. Tildu [ ~ ] zase C# kóduje, no Twitter ju potrebuje v pôvodnom stave.

Drobný problém tiež vznikol z toho, že kým C# robí URL encoding lower-case (napríklad “%aa”), Twitter ho na svojom konci robí upper-case (“%AA”). To sa však dá ľahko opraviť pomocou regulárnych výrazov.

A tak som po konzultácii s internetom napísal metódu, ktorá vykoná URL encoding tak, aby bol výsledok kompatibilný s Twitter API:

 private static string ProperURLEscape(string stringToEscape)
{
	// URL encoding podľa Microsoftu
	var result = HttpUtility.UrlEncode(stringToEscape, UTF8Encoding.UTF8).Replace("+", "%20");

	// lower-case -> upper-case
	Regex hexRegex = new Regex("%[0-9a-f]{2}", RegexOptions.Compiled);
	var matches = hexRegex.Matches(result);

	foreach (var m in matches)
		result = result.Replace(m.ToString(), m.ToString().ToUpper());

	// C# nekóduje (, ), $, !, * a "
	string[] notEncodedChars = new string[] { "(", ")", "$", "!", "*", "\'" };

	foreach (string c in notEncodedChars)
	{
		result = result.Replace(c, string.Format("%{0}", ((int)char.Parse(c)).ToString("X")));
	}

	// tilda nesmie byť zakódovaná
	result = result.Replace("%7E", "~");

	return result;
}

Snáď to niekomu príde vhod 🙂

Reklamy

One thought on “Twitter + C# = problematické spolužitie

Pridaj komentár

Zadajte svoje údaje, alebo kliknite na ikonu pre prihlásenie:

WordPress.com Logo

Na komentovanie používate váš WordPress.com účet. Odhlásiť sa / Zmeniť )

Twitter picture

Na komentovanie používate váš Twitter účet. Odhlásiť sa / Zmeniť )

Facebook photo

Na komentovanie používate váš Facebook účet. Odhlásiť sa / Zmeniť )

Google+ photo

Na komentovanie používate váš Google+ účet. Odhlásiť sa / Zmeniť )

Connecting to %s