Twitter、Facebook、LiveJournal、Vkontakteでのクロスポスト



crafthunters.comプロジェクトを書いたとき、私は顧客がプロモーションにソーシャルネットワークを使用していることに気付きました。 ウィジェットといいね!を使用しましたが、良いことにはニュースフィードにアクセスする必要がありました。 さらに、人気のVKontakteは9月にメインページにニュースをもたらしました。 つまり コンテンツを配信するには、人気のあるソーシャルネットワークのニュースフィードにアクセスするという単純な真実を使用して、スタンドアロンブログをソーシャルネットワークでのプレゼンテーションに適合させる必要がありました。 最初は、これは手動で行われ、トラフィックの半分以上をもたらしました。 その後、すべてが自動化されるようになりました。

人気のソーシャルネットワーク:



以前は手動で行っていた各ソーシャルネットワークへの自動クロスポストを構成する必要がありました。 また、ソーシャルネットワークへの投稿は、自分のウォール/ブログではなく、グループ/コミュニティで必要であることを明確にする必要があります。



次に、asp.net mvcのこれら4つのソーシャルネットワークのクロスホスティングの実装を紹介します。





0.基本原則。





まず最初に、権利を取得し、将来使用するためにデータベースに保存する必要があります。 2番目のステップは、コンテンツを追加するグループ/コミュニティにインストールすることでした(タスクは基本的に連絡のためだけです)。 3番目のステップは、元の投稿へのアクティブなリンクを持つグループ/コミュニティにエントリを作成することでした。



OAuthに基づくAPIはtwitter、facebook、vkontakteに使用されます。これらを使用するには、これらの目的で各ソーシャルネットワークにアプリケーションを登録する必要がありました。



繰り返さないために、OAuthがどのように機能するかをすぐに説明します(twitter xAuthの場合)。 まず、アプリケーションのIDと取得したい権限のリストを渡します。 権利のリストは、アプリケーションへのアクセスを許可するリソースです。 次のようになります。







許可後、アクセストークンを取得するコードを取得します。 このトークンをサーバーへの各リクエストに転送することで、サービスプロバイダー(VKontakte、Facebook、Twitter)が信頼できることを認識し、アクション(この場合はクロスホスティング)を実行できるようになります。



1. Livejournal





LJはクロスホスティングに長い間使用されており、XML-RPCコマンドを使用してこれを行います。

.net xml-rpcのライブラリ( http://www.xml-rpc.net/ )を使用してドキュメント( http://www.livejournal.com/doc/server/ljp.csp.xml-rpc.protocol.html )を読んだ後)実装を開始しました。



インタラクションインターフェイスを作成します。



public interface ILj : IXmlRpcProxy { [XmlRpcMethod("LJ.XMLRPC.login")] LjUserInfo Login(UserPassword user); XmlRpcMethod("LJ.XMLRPC.postevent")] PostLjAnswer Post(PostLj post); }
      
      







アクセスを取得する





ログインとパスワードはクリアテキストで送信され、Webサービスプロトコルを介して送信されます。 権利を取得するためのクラスを作成します。

 public class UserPassword { [JsonProperty("username")] public string username { get; set; } [JsonProperty("password")] public string password { get; set; } public int ver { get { return 1; } } }
      
      







パブリケーションごとに、ユーザー名とパスワードも送信されるため、ログインメソッドは基本的にユーザー名とパスワードのペアの正確性のみをチェックします。



アクセスチェック。



 public LjUserInfo Auth(UserPassword username) { ILj proxy = XmlRpcProxyGen.Create<ILj>(); var ans = proxy.Login(username); return ans; }
      
      





肯定的な答えに対する答えを分析し、そうでない場合はエラーを出します。



レコードの追加も同様に簡単です。

 public void Publish(UserPassword username, Post message, string ljgroup = null) { ILj proxy = XmlRpcProxyGen.Create<ILj>(); var post = new PostLj(); post.username = username.username; post.password = username.password; post.ver = 1; post.@event = message.Content; post.subject = message.Title; post.lineendings = "pc"; post.year = DateTime.Now.Year; post.mon = DateTime.Now.Month; post.day = DateTime.Now.Day; post.hour = DateTime.Now.Hour; post.min = DateTime.Now.Minute; if (!string.IsNullOrWhiteSpace(ljgroup)) { post.usejournal = ljgroup; } else { post.usejournal = username.username; } var ans = proxy.Post(post); }
      
      





実際、すべてが非常に簡単です。 もちろん、多くの追加オプションがあり、ライブラリは非常に広範囲ですが、タスク-LJに投稿を追加する-は簡単に解決されます。



気に入らなかったのは、パスワードが平文またはmd5で安全でないチャネルを介して送信されることでした。



2. Twitter





twitterでは、人気のあるライブラリwww.twitterizer.netを使用しましたが、最初にdev.twitter.com/appsでアプリケーションを登録する必要がありました



アプリケーションが要求する権利は、読み取りと書き込みの両方です。 さらに、アプリケーションは使用する無限のトークンの有効期限を受け取ります。 このトークンはデータベースに保存する必要があります。 (Social.JsonResourceテーブル)



権利の取得は、次のシナリオで行われます。

 public string Authorize(string redirectTo) { OAuthTokenResponse requestToken = OAuthUtility.GetRequestToken(Config.twitterConsumerKey, Config.twitterConsumerSecret, redirectTo); // Direct or instruct the user to the following address: Uri authorizationUri = OAuthUtility.BuildAuthorizationUri(requestToken.Token); return authorizationUri.ToString(); }
      
      





2つのキー(アプリケーションキーとシークレットキー)を転送し、twitterページに移動して権限を確認します。 Twitterは権利を要求し、アドレスredirectToに私たちを返し、そこでさらにコードを渡します。 このコードにより、アクセストークンを取得します。 次に、アプリケーションを介してステータスを更新します(短いメッセージを作成します):

 public void Publish(Post post) { var tokens = new OAuthTokens(); tokens.ConsumerKey = Config.twitterConsumerKey; tokens.ConsumerSecret = Config.twitterConsumerSecret; tokens.AccessToken = twitterAccessToken.Token; tokens.AccessTokenSecret = twitterAccessToken.TokenSecret; TwitterStatus.Update(tokens, post.TwitterText); }
      
      







3. Facebook





アプリケーションをdeveloper.facebook.com/appsに登録します。



アクセストークンを取得します。 まず、許可を得るために送信します。

 public string Authorize(string redirectTo) { return string.Format(AuthorizeUri, Config.AppId, redirectTo); } public ActionResult GetFbCode() { var fbSocial = currentUser.Socials.Where(p => p.Provider == "facebook").FirstOrDefault(); if (fbSocial != null) { return RedirectToAction("Index"); } else { return Redirect(fbProvider.Authorize("http://" + HostName + "/Social/SaveFbCode")); } }
      
      





コードを処理してアクセストークンを取得します。

 public ActionResult SaveFbCode() { if (Request.Params.AllKeys.Contains("code")) { var code = Request.Params["code"]; if (ProcessFbCode(code)) { return RedirectToAction("Index"); } } return View("CantInitialize"); } protected bool ProcessFbCode(string code) { if (fbProvider.GetAccessToken(code, "http://" + HostName + "/Social/SaveFbCode")) { var jObj = fbProvider.GetUserInfo(); var fbUserInfo = JsonConvert.DeserializeObject<FbUserInfo>(jObj.ToString()); var fbAccess = new FbAccessToken() { AccessToken = fbProvider.AccessToken }; var jsonFbAccess = JsonConvert.SerializeObject(fbAccess); var fbSocial = currentUser.Socials.Where(p => p.Provider == "facebook").FirstOrDefault(); if (fbSocial == null) { fbSocial = new Models.Social() { UserID = currentUser.ID, JsonResource = jsonFbAccess.ToString(), Provider = "facebook", UserInfo = jObj.ToString() }; repository.CreateSocial(fbSocial); } else { fbSocial.UserInfo = jObj.ToString(); repository.UpdateSocial(fbSocial); } return true; } return false; }
      
      





ここで、無制限のアクセストークンを受信する際の重要な詳細は、requestパラメータでrequest&scope = ... offlineとする必要があります。これにより、このトークンを常に要求する必要がなくなります。



投稿作成



 public ActionResult CrossPostFb(int id) { var post = repository.Posts.Where(p => p.ID == id).FirstOrDefault(); var fbSocial = currentUser.SocialGetByProvider("facebook"); if (post != null && post.UserID == currentUser.ID && fbSocial != null) { var postSocial = new Social.Post(); if (!string.IsNullOrWhiteSpace(post.PreviewUrl)) { //   postSocial.Preview = "http://" + HostName + post.PreviewUrl; } postSocial.Title = post.Title; postSocial.Teaser = post.Subtitle; //    postSocial.Link = "http://" + HostName + "/Post/" + post.ID.ToString(); //   var fbAccess = JsonConvert.DeserializeObject<FbAccessToken>(fbSocial.JsonResource); fbProvider.AccessToken = fbAccess.AccessToken; //  fbProvider.Publish(postSocial); repository.CrossPost(post, Post.CrossProvider.facebook); } return RedirectToAction("Index"); }
      
      





設定されたパラメータに応じて、レコードが作成されます。 アクティブなリンクを設定すると、facebookは必要な画像を選択します



4. Vkontakte





Vkontakteは最も難しい相互作用アルゴリズムを提供します。



順番に始めましょう:スタンドアロンアプリケーション(Webではなく)のみが、自分のウォールとグループのウォールの両方に投稿を作成できるため、[x ]スタンドアロンアプリケーション。



2番目:録画に画像を追加するには、まずそれをダウンロードする必要があります。



3番目:写真をダウンロードするには、ダウンロードが行われるサーバーアドレスを要求する必要があります。



4番目:元の投稿へのリンクはattachmentsパラメーターに配置されます。リンクを追加しても、メモの追加は保証されません。



実際、残りは同じなので、始めましょう、そして権利を取得しましょう:

 public ActionResult GetVkCode() { var vkSocial = currentUser.Socials.Where(p => p.Provider == "vkontakte").FirstOrDefault(); if (vkSocial != null) { return RedirectToAction("Index"); } else { return Redirect(vkProvider.Authorize("http://" + HostName + "/Social/SaveVkCode")); } } public string Authorize(string redirectTo) { return string.Format(AuthorizeUri, Config.AppKey, redirectTo); }
      
      







クロスホスティングでは、写真、グループ、ウォール、オフラインのアクセスレベルをリクエストします。

つまり 壁のグループにはいつでも写真をアップロードできます。



転記





グループのウォールに投稿する前に、このグループの番号を名前(groups.getById)で調べる必要があります。 驚くべきことに、グループ(および個人ページ)には負の方向に番号が付けられています。 つまり

結果を受け取った後、gid値に-1を掛ける必要があります。



次に、サーバーに写真をアップロードするように要求します。photos.getUploadServerではなく、photos.getWallUploadServerです。



次に、受信したURLリクエストの投稿を介してVKontakteサーバーに写真を送信します。 UploadHelperライブラリ( http://aspnetupload.com/ )を使用しました。



サーバーにアップロードした後、この画像を保存するコマンドを送信する必要があります。photos.saveWallPhoto-写真のIDを取得します。 photos.getWallUploadServerの代わりにphotos.getUploadServerを使用した場合、写真は保存されません。



そして、次のステップで、グループ/または個人ページ(wall.post)の壁に写真を追加します。



実際にはすべて。



5.パン





ここで試すことができます: http : //cocosanka.ru (登録後、意味のないものをブログに書いてから投稿できます)。



ここからソースをダウンロード: https : //bitbucket.org/chernikov/cocosanka2



データを処理するために、Json.netライブラリ( http://json.codeplex.com/ )を使用して、自動的に受信した文字列をオブジェクトに変換しました。



アプリケーションキーはWeb.configに保存されますが、独自のキーを登録する必要があります。



All Articles