C#経由のVkontakte wall.post

1つのプロジェクトのフレームワーク内で、VKontakteコミュニティウォールに更新プログラムの自動公開を実装することが必要になりました。 同様のタスクは非常に一般的だと思います。 C#で実装の既製の例を提供します。

これを行うには、次のものが必要です。
  1. アプリケーションを登録し、AppIDとAppSecretを取得します。 これを行う方法をここで説明します
  2. ユーザーをVKontakteページに誘導し、ユーザーに代わってアクションのアプリケーションに権限を付与することを確認します。
  3. トークンを取得します。
  4. 壁に投稿します。

ステップ1:アプリケーションを登録する


アプリケーションを登録した後、さらに必要な2つのパラメーターを受け取ります。
  1. アプリケーションID( AppID );
  2. アプリケーション秘密鍵( AppSecret )。

ステップ2:コードを取得する


確認が成功した場合、VKontakteアプリケーションに権限を付与すると、 Codeパラメーターが返されます。このパラメーターは、 トークン -aを取得する必要があります。 GetCode()メソッドでクラスVkを作成します。これにより、ユーザーは対応するページに移動します。
public static class Vk
{
public static void GetCode()
{
string reqStrTemplate =
"http://api.vkontakte.ru/oauth/authorize?client_id={0}&scope=offline,wall" ;

System.Diagnostics.Process.Start(
string .Format(reqStrTemplate, Publics.Vk_AppID));

}
}


* This source code was highlighted with Source Code Highlighter .


私の場合、これはデスクトップアプリケーションであるため、Codeパラメーターを使用するには、ユーザーが個別にページからコピーしてアプリケーションに渡す(対応する編集に入力する)必要があります。 Webアプリケーションを使用している場合、状況は少し改善されており、getリクエストパラメーター(&redirect_uri = http:// yoursite)でリダイレクトのアドレスを設定し、アプリケーションに直接Codeパラメーターを取得できます。

ステップ3:トークン


トークン (キー)を受け取ったら、ステップ1から3を省略することで、将来ユーザーに代わってアクションを実行できるようになります。 本質的に、トークンは、OAuthプロトコルをサポート/複製するアプリケーションの承認の基盤です。 そのため、トークンを取得するには、 AppIDAppSecretおよびAppCodeを指定する必要があります。 アプリケーションの登録時に1番目と2番目のパラメーターを受け取り、前のステップでAppCodeパラメーターを受け取りました。
トークンが正常に受信されると、VKontakteは、トークン、トークンの有効期限、およびトークンがマップされているユーザーIDとともにjsonを返します。
public class VkJsonTokenResponse
{
public string access_token { get ; set ; }
public string expires_in { get ; set ; }
public string user_id { get ; set ; }
}


* This source code was highlighted with Source Code Highlighter .


public static string GetToken( string Code)
{
string reqStrTemplate =
"https://api.vkontakte.ru/oauth/access_token?client_id={0}&client_secret={1}&code={2}" ;

string reqStr = string .Format(reqStrTemplate, Publics.Vk_AppID, Publics.Vk_Secret, Code);

WebClient webClient = new WebClient();
string response = webClient.DownloadString(reqStr);

JavaScriptSerializer s = new JavaScriptSerializer();
VkJsonTokenResponse jsonResponse = s.Deserialize<VkJsonTokenResponse>(response);
Token = jsonResponse.access_token;
SaveTokens();
return Token;
}


* This source code was highlighted with Source Code Highlighter .


ステップ4:壁に投稿する最後のステップ


テキスト、リンク/メディアコンテンツを公開することが可能です。
public static string PostMessage( string Message, string Link, string CapchaID, string CapchaKey)
{
string reqStr = string .Format(
"https://api.vkontakte.ru/method/wall.post?owner_id={0}=&access_token={1}&message={2}" ,
Publics.Vk_GroupID, Vk.Token, Message);

if (! string .IsNullOrEmpty(Link))
reqStr += string .Format( "&attachment={0}" , System.Web.HttpUtility.UrlEncode(Link));

if (! string .IsNullOrEmpty(CapchaID))
reqStr += string .Format( "&captcha_sid={0}" , CapchaID);

if (! string .IsNullOrEmpty(CapchaKey))
reqStr += string .Format( "&captcha_key={0}" , CapchaKey);

WebClient webClient = new WebClient();
return webClient.DownloadString(reqStr);
}


* This source code was highlighted with Source Code Highlighter .

プレーンテキストを公開すると、応答としてpost_idが返されます。 テキストとリンクを公開すると、 処理が行われます:1 。これは、VKontakteがリクエストを受け入れたことを意味し、おそらく投稿を公開します。 なぜ「たぶん」記事の終わりを参照してください。
さて、トークンをロードして保存するためのコード:
private static void SaveTokens()
{
XmlSerializer s = new XmlSerializer( typeof ( string ));
FileStream fs = new FileStream (Publics.CurrPath + "vk.xml" , FileMode .OpenOrCreate);
s.Serialize(fs, Token);
fs.Flush();
}

public static void LoadTokens()
{
try
{
XmlSerializer s = new XmlSerializer( typeof ( string ));
FileStream fs = new FileStream (Publics.CurrPath + "vk.xml" , FileMode .Open);
Token = ( string )s.Deserialize(fs);
}
catch (Exception ex)
{
Error.SaveError( "Vk.LoadTokens" , ex.Message);
}
}


* This source code was highlighted with Source Code Highlighter .

1つのパラメーターをxmlに保存するのは過剰ですが、この記事のコードがカットされる前に、複数のパラメーターがありました。

いくつかの実用的なヒント/失望


  1. 自分のウォール以外の場所にリンクを投稿することはできません。 回避策は、VKontakteがテキストを認識してクリック可能にする一方で、リンクをテキストに追加することです。 例はこちらです。
  2. (ページへの)リンク付きの投稿を公開する場合は、リンクが有効であることを確認してください(既存のページにつながる+ System.Web.HttpUtility.UrlEncode(リンク)を忘れないでください)。 これは重要です。リンクが有効でない場合、投稿は公開されず、あなたはそれに従うことができません(上で書いたように、リンクのある投稿は非同期モードで公開され、それに応じて処理を受け取ります:1;
  3. リンクと写真を同時に公開することはできません。
  4. グループに代わって投稿することはできません。
  5. 2〜5分の間隔で公開リクエストを送信します。そうしないと、キャプチャの認識を整理する必要があります。公開リクエストに応答して、キャプチャ画像へのリンクを受け取ります。認識された値( captcha_key )。


VKontakte APIの悲惨さにもかかわらず、ポータル/雑誌/ブログのニュースのVKontakteグループへの自動投稿を実装するのは非常に簡単です。
参照:
  1. Vkontakte APIドキュメント

Source: https://habr.com/ru/post/J125409/


All Articles