Twitter, OAuth, Hammock, TweetSharp и Windows Phone 7
В течение нескольких дней я пытался заставить OAuth работать с Twitter в моем приложении для Windows Phone, но вся информация, которую я нашел, устарела или трудна для понимания. В конце концов я где-то попал, когда нашел это сообщение в блоге http://samjarawan.blogspot.co.uk/2010/09/building-real-windows-phone-7-twitter_18.html которое дало мне возможность получить токен доступа., в этот момент это не удалось.
Мой код почти идентичен тому, что был в сообщении в блоге, в значительной степени просто изменил ключ потребителя и секрет потребителя. Даже их приложение не работает. Он прекрасно отображает экран входа в систему Twitter и успешно проходит аутентификацию, но в функции RequestAccessToken происходит сбой на этом этапе:
if (String.IsNullOrEmpty(twitteruser.AccessToken) || String.IsNullOrEmpty(twitteruser.AccessTokenSecret))
{
Dispatcher.BeginInvoke(() => MessageBox.Show(response.Content));
return;
}
Действительно раздражает то, что в окне сообщения отображается только символ замены Unicode () и ничего больше. Я также проверил response.StatusCode и все в порядке, поэтому, насколько я могу судить, ошибки нет.
Если бы кто-то мог помочь мне с этим, это было бы здорово. Я видел другие учебные пособия, которые требуют ввода типа пользователя в ПИН-коде, но я также не смог заставить ни один из них работать.
РЕДАКТИРОВАТЬ: Я только что попытался заставить TweetSharp работать, но еще раз он не может получить токен доступа. Вот код, который я использую для TweetSharp:
public partial class TwitterAuthorisationPage : PhoneApplicationPage
{
private const string consumerKey = "myKey";
private const string consumerSecret = "mySecret"; // These are the correct values for my app
private const string requestTokenUri = "https://api.twitter.com/oauth/request_token";
private const string oAuthVersion = "1.0a";
private const string authorizeUri = "https://api.twitter.com/oauth/authorize";
private const string accessTokenUri = "https://api.twitter.com/oauth/access_token";
private const string callbackUri = "http://bing.com";
private TwitterService twitterService = new TwitterService(consumerKey, consumerSecret);
private OAuthRequestToken _requestToken = null;
public TwitterAuthorisationPage()
{
InitializeComponent();
}
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
base.OnNavigatedTo(e);
twitterService.GetRequestToken((requestToken, response) =>
{
if (response.StatusCode == HttpStatusCode.OK)
{
_requestToken = requestToken;
Dispatcher.BeginInvoke(() => BrowserControl.Navigate(twitterService.GetAuthorizationUri(requestToken)));
}
else
{
Dispatcher.BeginInvoke(() => MessageBox.Show("Failed to connect to Twitter. Please try again.\n" + response.StatusDescription));
}
});
}
private void ConfirmButton_Click(object sender, RoutedEventArgs e)
{
twitterService.GetAccessToken(_requestToken, PINEntry.Text, (accessToken, response) =>
{
if (response.StatusCode == HttpStatusCode.OK)
{
//These lines just print ?
System.Diagnostics.Debug.WriteLine(accessToken.Token);
System.Diagnostics.Debug.WriteLine(accessToken.TokenSecret);
twitterService.AuthenticateWith(accessToken.Token, accessToken.TokenSecret);
twitterService.VerifyCredentials((user, verifyResponse) =>
{
if (verifyResponse.StatusCode == HttpStatusCode.OK)
{
Dispatcher.BeginInvoke(() => MessageBox.Show(user.Name));
}
else
{
// Fails here
Dispatcher.BeginInvoke(() => MessageBox.Show("Failed to connect to Twitter. Please try again.1\n" + verifyResponse.StatusDescription));
}
});
}
else
{
Dispatcher.BeginInvoke(() => MessageBox.Show("Failed to connect to Twitter. Please try again.0\n" + response.StatusDescription));
}
});
}
}
РЕДАКТИРОВАТЬ 2: это может быть связано с этим? https://dev.twitter.com/blog/ssl-upgrade-for-twitterapi
2 ответа
Я решил это! Оказывается, Твиттер возвращал токен доступа Gzipped. Используя метод, описанный в сообщении в блоге, мне пришлось изменить второй RestClient, который будет построен следующим образом:
var client = new RestClient
{
Authority = "https://api.twitter.com/oauth",
Credentials = credentials,
HasElevatedPermissions = true,
SilverlightAcceptEncodingHeader = "gzip",
DecompressionMethods = DecompressionMethods.GZip
};
И теперь это работает!
У меня та же проблема, но я не понял вашего решения, не могли бы вы объяснить немного больше, где вы сменили остальных клиентов?
-----РЕДАКТИРОВАТЬ----
Я наконец смог заставить его работать с TweetSharp. Я скачал исходный код и добавил упомянутые вами строки в конфигурацию оставшегося клиента, и снова скомпилировал проект. Так как я не могу отправить свои изменения на этот GitHub, я загружаю DLL здесь. TweetSharp перекомпилирован dll
Это код, который я использую, который с ним работает
// Step 1 - Retrieve an OAuth Request Token
Service.GetRequestToken((requestToken, response) =>
{
if (response.StatusCode == HttpStatusCode.OK)
{
Request = requestToken;
Uri uri = Service.GetAuthorizationUri(requestToken);
Dispatcher.BeginInvoke(() =>
{
Browser.Navigate(uri);
}
);
}
});
//Step 2, get the pincode
string html = Browser.SaveToString(); //gets the DOM as a string
Regex expression = new Regex(@"<code>(?<word>\w+)</code>");
Match match = expression.Match(html);
string pin = match.Groups["word"].Value;
if (pin != "")
{
loginTwitter(pin); //we login with the pin extracted
}
//step 3, get access tokens from twitter
private void loginTwitter(string pin)
{
Service.GetAccessToken(Request, pin, processAccessToken);
}
public void processAccessToken(OAuthAccessToken access, TwitterResponse Response){
if (Response.StatusCode == HttpStatusCode.OK)
{
if (access != null)
{
Access = access; // Store it for reuse
Service.AuthenticateWith(access.Token, access.TokenSecret);
}
}
}