
crafthunters.comプロジェクトを書いたとき、私は顧客がプロモーションにソーシャルネットワークを使用していることに気付きました。 ウィジェットといいね!を使用しましたが、良いことにはニュースフィードにアクセスする必要がありました。 さらに、人気のVKontakteは9月にメインページにニュースをもたらしました。 つまり コンテンツを配信するには、人気のあるソーシャルネットワークのニュースフィードにアクセスするという単純な真実を使用して、スタンドアロンブログをソーシャルネットワークでのプレゼンテーションに適合させる必要がありました。 最初は、これは手動で行われ、トラフィックの半分以上をもたらしました。 その後、すべてが自動化されるようになりました。
人気のソーシャルネットワーク:
- フェイスブック
- VKontakte
- ライブジャーナル
以前は手動で行っていた各ソーシャルネットワークへの自動クロスポストを構成する必要がありました。 また、ソーシャルネットワークへの投稿は、自分のウォール/ブログではなく、グループ/コミュニティで必要であることを明確にする必要があります。
次に、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に保存されますが、独自のキーを登録する必要があります。