最小のVKontakteおよびXDocument API

良い時間です。



VK APIを使用する最も簡単な方法について再度お話ししたいと思います。この記事が初心者開発者の出発点になることを願っています。 かなり多様なメソッドmessages.getHistoryを使用し、XDocumentを使用して写真を取得します。 認証方法を習得し、APIの操作を試してみたい方は、catの下でお願いします。



始めましょうか?


そこで、ログインしてトークンを受け取りました。 次は? 初心者がVK APIの世界に慣れるのに役立つ、かなり興味深い方法の例を挙げたいと思います。 基本メソッドのリストで上記のメソッドが見つからなかった場合は、 ここに移動しさまざまなオプションの大きなリストを確認します。 それらの1つで作業を開始します。



今日のタスクは、ユーザーとのすべてのメッセージを受信し、xmlノードを処理し、すべての通信から写真をダウンロードすることです。 必要なノードのように見えます





明らかに、説明にはメソッドに関する詳細情報のほとんどすべてが含まれてます。 それでは、見てみましょう:

説明:

指定したユーザーまたはグループの会話のメッセージ履歴を取得します。


結果:

メッセージオブジェクトの配列を返します-ユーザーまたはグループの会話を含む指定されたダイアログ内のプライベートメッセージ。 各メッセージオブジェクトには一連のフィールドが含まれており、その説明はここから入手できます。




6つのパラメーターを自由に使用できますが、そのうち2つは必須です。 それぞれについての詳細:



uidはおそらく最も重要なパラメーターです。 サーバーは、メッセージ履歴を受信するユーザーを知っている必要があります。

chat_id - uidを指定した場合のオプションのパラメーター。

offset- 選択のオフセット。 簡単に言えば、このパラメーターを使用しないと、1つの回答で200メッセージという制限があるため、大きな通信を取得できません。

countは、サーバーから受信するメッセージの数です。 リクエストごとに200メッセージという制限があることに注意してください。

start_mid- 後続のメッセージを受信する必要があるメッセージ識別子。 countと混同しないでください。 この引数には、シーケンス番号ではなくメッセージIDを入力します。

rev-どのメッセージからの対応が必要か 最後または最初。 デフォルトでは0であり、時系列の逆順を意味します。



必需品


悪くないでしょ? 試してみましょう。

LINQ to XMLで作業することを思い出してください。 必要なネームスペースを接続します



using System.Xml.Linq;
      
      







私の意見では、非常に強力なXMLパーサーにアクセスできるようになりました。 それで宣言しましょう



 XDocument doc;
      
      







うまくいきましたか? その後、続行します。 対応が非常に大きい場合は、オフセットを使用してオフセットパラメーターを指定する必要があることを覚えています。 次に、繰り返しごとに200ずつ増加するカウンターを作成します。 また、保存時に動的な写真名のカウンターを作成します



 int m=0; int k=0;
      
      







もちろん、写真のダウンロードに役立つWebClientを忘れないでください。



 WebClient src_client = new WebClient();
      
      







ノスタルジックな写真を含むプログラムで他のすべてのファイルを詰まらせないように、別のフォルダーを作成する価値があると思います。

 Directory.CreateDirectory("img/");
      
      







まだ成功することを願っています。 そして今、楽しい部分です。 次に、サーバーにリクエストを行い、タスクを達成するために必要な引数をサーバーに示します。



 doc = XDocument.Load("https://api.vk.com/method/messages.getHistory.xml?uid=123456&offset=" + m + "&count=200&access_token=" + token);
      
      







最初に、 messages.getHistoryメソッドに受信した.xmlデータの形式を指定したことに注意してください。 通常、LINQ to XMLが処理できないJSONを返します。 また、ストーリーが必要なユーザーのuidも指定しました。 そしてもちろん、 offsetは最後に到達するまで毎回変更されます。 カウントは必要なものを設定します。 ただし、200を超えないようにしてください。さもないと、サーバーが疲れて休息してエラーが返されます。 そしてもちろん、トークンを示します。



XMLの仕事


次に、サイクル自体を検討します。 私は最適化されたコードのふりをせず、それを削減できることを理解していますが、同様のXMLでパーサーの詳細な作業を示したいと思います。



 while (true) { doc = XDocument.Load("https://api.vk.com/method/messages.getHistory.xml?uid=12345&offset=" + m + "&count=200&access_token=" + token);//   xml      foreach (XElement el in doc.Root.Elements())//    { //         if (el.Name.ToString() == "message") { foreach (XElement el_msg in el.Elements())//    message { //     if (el_msg.Name == "attachment") { foreach (XElement el_attch in el_msg.Elements()) { //     ,   ,    if (el_attch.Name == "photo") { foreach (XElement el_photo in el_attch.Elements()) { //     if (el_photo.Name == "src_xbig") { //    img/ src_client.DownloadFile(el_photo.Value, "img/img" + k + ".jpg"); k++; } } } } } } } } //      count m += 200; }
      
      







LINQ


LINQバージョンのAtreides07に感謝します。 残念ながら、私はすぐにそれを書くことを考えていませんでした。

 while (true) { var doc = XDocument.Load("https://api.vk.com/method/messages.getHistory.xml?uid=12345&offset=" + m + "&count=" + n + "&access_token=" + token);//   xml      var photoElements= doc.Root.Elements("message") .SelectMany(el => el.Elements("attachment") .SelectMany(el_msg => el_msg.Elements("photo") .SelectMany(elAttch => elAttch.Elements("src_xbig")))); foreach (var el_photo in photoElements) { //    img/ src_client.DownloadFile(el_photo.Value, "img/img" + k + ".jpg"); k++; } //      count m += n; }
      
      







XPath


 using System.Xml.XPath;
      
      





また、XPathオプションを示す価値があると思います。

  //   XPathDocument document_x = new XPathDocument("https://api.vk.com/method/messages.getHistory.xml?uid=12345&offset=" + m + "&count=200&access_token=" + token); XPathNavigator navigator = document_x.CreateNavigator(); //  string str_exp = "//message//attachment//photo//src_big"; XPathExpression expres = XPathExpression.Compile(str_exp); XmlNamespaceManager manager = new XmlNamespaceManager(navigator.NameTable); expres.SetContext(manager); XPathNodeIterator nodes = navigator.Select(expres); while (nodes.MoveNext())//    src_client.DownloadFile(nodes.Current.ToString(), "img/imj" + k + ".jpg");// 
      
      





もちろん、サイクルとmの増加を忘れないでください。



それだけです。 プログラムを起動した場所からフォルダーを開き、imgフォルダーを見つけて結果を楽しみます。



おわりに


ご覧のとおり、VKontakte APIの操作は非常に簡単で、便利なLINQ to XML機能を使用すると、より詳細で理解しやすくなります。 あなたがそれを楽しんだことを願っています。 読んでくれてありがとう。



記事に欠陥を明記してください。 勉強します。



All Articles