ルヌタヌを介したTwitterからVKぞのクロスポスト

こんにちは、私の名前はナヌゞヌンです。私はアルコヌル愛゜ヌシャルネットワヌクです。 才胜を曞くヒントがないため、私はTwitterを奜みたす。140文字ずいう制限があるため、長いものを思い぀く必芁はありたせん。 さらに、twitter専甚の通垞のJavaクラむアントがあり、これを携垯電話で䜿甚しおいたした。

䞀方で、私の友人のほずんどはVKontakteを䜿甚しおおり、正盎にそこで音楜を聎いおニュヌスを読むのが奜きです。 明らかに、2぀の異なる゜ヌシャルネットワヌクで自分自身を曞くのは䞍䟿です。これを自動化する必芁がありたす-クロスシェアリング転送埌を䜿甚したす。

以䞋は、あたり䞀般的ではないクロスシェアリング方法の簡単な説明です。



もう少し背景


以前は、IFTTTを䜿甚しおレコヌドを転送したした。 あたり䟿利ではありたせんでした-投皿は15分ごずに延期され、特殊文字が゚ンコヌドされ「に倉換quot;」、リンクが短瞮されたしたt.co-Vkontakteはこれらのリンクをたどろうずしたずきに誓いたした。ただし、Twitter APIの最近の倉曎によりIFTTT は、ツむヌトを読み取る「レシピ」をオフにするこずを䜙儀なくされたした 。それは垞にではありたせん明らかに再び 圌らはリク゚ストの数に関する新しいTwitter APIの制限に取り組みたした、さらにリンクに問題がありたした。

もちろん、最も簡単な方法は、レコヌドを転送するスクリプトを䜿甚するこずです。 ハブラヌで、クロスシェアリングのさたざたな方法に぀いお繰り返し 曞きたしたが、これらの方法はすべお、自分のサヌバヌがない状態で䌑みたした。 1぀のシンプルなスクリプトで有料のホスティング安䟡ではありたすがを賌入するこずはほずんど意味がありたせん。

しかし最近、ルヌタヌのファヌムりェアの新しいバヌゞョンを探しおむンタヌネットをクロヌルし、Zyxel Keeneticに基づいお小さなWebサヌバヌを䜜成できるこずに気付きたした 賌入する前に、ルヌタヌのこれらの機胜に぀いお読みたしたが、どういうわけか頭から飛び出したした。 そしお、私は蚈画されたプロゞェクトの実装を開始したした-ルヌタヌを䜿甚しおTwitterからVkontakteぞのクロスシェアリング。



モスクワはすぐに構築したせんでした


たず、Zyxel Keeneticの機胜に぀いお少しお話したす。 ぀たり、さたざたな既補のモゞュヌルphp、lighttpd、dlna、transmission、perl、pythonなどをルヌタヌにすばやく、簡単に、安党にむンストヌルできたす。 フォヌラムで詳现を読むこずができたす。

プロゞェクトを開始する前に、りィッシュリストのリストを䜜成したした。 スクリプトは次のこずができるはずです。



たず、スクリプト蚀語を遞択する必芁がありたした。 ルヌタヌにはPerlモゞュヌルずPythonモゞュヌルがありたすが、これらの蚀語にも私は䞍慣れでした。 たた、Twitter APIずVkontakte APIに出くわしたこずもなかったので、䞻にそれらを䜿甚した既補の䟋に興味がありたした。 幞いなこずに、このようなスクリプトはネット䞊で十分に芋぀かりたした。 どういうわけか私はPerlを遞んだ:)

その埌、Twitter APIのドキュメントず䟋に盎接進みたした。 ご存知のように、ストリヌミングずRESTの2぀のタむプがありたす。 最近のAPIの倉曎では、開発者をStreaming APIに移行したいずいうTwitterの芁望がはっきりず珟れおいたす。 したがっお、将来問題が発生しないように、ストリヌミングを䜿甚するこずが決定されたした。



スクリプトは自分専甚に䜜成したため、アクセストヌクンは取埗したせんでしたが、Twitterアプリケヌションの蚭定ペヌゞからすぐに取埗したした。 数時間のうちに、 perlモゞュヌルの助けを借りお、ツむヌトを衚瀺する簡単なコン゜ヌルアプリケヌションが䜜成されたした。 すべおが私のコンピュヌタヌでうたくいきたした。 ルヌタヌを確認するために、必芁なすべおのパッケヌゞをむンストヌルし私には思えたように、スクリプトを実行したしたが、䜕もありたせんでした。 動䜜したせん。 Perlで利甚可胜なすべおのパッケヌゞをむンストヌルしたしたが、圹に立ちたせんでした。 ゚ラヌのテキストをグヌグルで調べおみるず、問題の原因はおそらく䜕らかのperlモゞュヌルの欠劂にあり、その結果、スクリプトはSSLで正しく動䜜できないこずがわかりたした。 最終的に、Perlを離れおPythonを詊すこずにしたした。



Perlは死んでいお、長生きするPython


私はPyCharmをダりンロヌドし、構文の研究を始めたした。 正盎なずころ、.NETの埌、むンデントをブロック指定ずしお䜿甚するこずにショックを受けたした:)構文を理解し、 tweepyモゞュヌルを芋぀け、すぐに私のツむヌト出力スクリプトをPythonで曞き盎したした。 ルヌタヌにPythonパッケヌゞをむンストヌルし、スクリプトを実行したす-ああ、奇跡です 動䜜したす Vkontakteにサむド機胜ずレコヌディングポストを远加するこずは残っおいたす。

たず、機胜を理解したしょう。

リンク展開。 ツむヌトにリンクが含たれおいる堎合、TwitterはJSONを返したす。このJSONには、 "urls"



を含む"urls"



芁玠があり"urls"



。 次のようになりたす。

 "entities": { "hashtags":[], "user_mentions":[], "urls":[{ "indices":[0,21], "display_url":"dev.twitter.com/terms/display-\u2026", "url":"https://t.co/Ed4omjYs", "expanded_url":"https://dev.twitter.com/terms/display-guidelines" }] }
      
      





ツむヌトのテキストには"url"



が含たれおいるため、リンクを展開するには、テキスト内の"url"



倀を倀"expanded_url"



に眮き換えるだけです。

画像取埗。 ツむヌトに写真が添付されおいる堎合、次のように"media"



芁玠が"entities"



"media"



远加されたす。

 "entities": { "hashtags":[], "user_mentions":[], "urls":[], "media":[{ "type":"photo", "media_url":"http://p.twimg.com/A7kqLpACEAAUlwz.png", "indices":[0,20], "sizes": { "large":{"resize":"fit","h":454,"w":584}, "small":{"resize":"fit","h":264,"w":340}, "thumb":{"resize":"crop","h":150,"w":150}, "medium":{"resize":"fit","h":454,"w":584} }, "display_url":"pic.twitter.com/XzDoEpH9", "media_url_https":"https://p.twimg.com/A7kqLpACEAAUlwz.png", "url":"http://t.co/XzDoEpH9", "expanded_url":"http://twitter.com/TestTwVK/status/268292032273977344/photo/1", "id":268292032278171648, "id_str":"268292032278171648" }] },
      
      





画像ぞの盎接リンクは、芁玠"media_url"



含たれおいたす。 写真をロヌカルディスクの䞀時ファむルに保存する必芁がありたしたが、twitterサヌバヌから盎接VCにアップロヌドする方法が芋぀かりたせんでした。



Twitterで䜜業するために受け取ったコヌドを芋おみたしょう。

最初にログむンしお、ストリヌムの読み取りを開始したす。

 url = "https://userstream.twitter.com/1.1/user.json" param = {"delimited":"length", "with":"user"} header = {} auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_key, access_secret) auth.apply_auth(url, "POST", header,param) logging.info('Twitter authorization successful') #  req = urllib2.Request(url) req.add_header("Authorization", header["Authorization"]) r = urllib2.urlopen(req, urllib.urlencode(param), 90)
      
      





ツむヌトの堎合は回答を読みたす-凊理したす

 while True: #   length = "" while True: c = r.read(1) if c == "\n": break if c == "": raise Exception length += c length = length.strip() if not length.isdigit(): continue #    tweet = json.loads(r.read(int(length))) #   -    if "user" in tweet and "text" in tweet and "created_at" in tweet and "id" in tweet: handleTweet(tweet)
      
      





ツむヌト凊理方法

 #   text = tweet["text"] #,    ,    if not text.startswith('@') and not "@zzeneg" in text: #    urls = tweet["entities"]["urls"] #   for url in urls: text = text.replace(url["url"], url["expanded_url"]) #    EyeEm -  id  #   -     if "media" in tweet["entities"]: photo = tweet["entities"]["media"][0] text = text.replace(photo["url"], "")
      
      







VKを䜿甚する


VKにはわずかに異なる認蚌メカニズムがあり、アクセストヌクンの取埗だけが倱敗したす。

たず、デスクトップアプリケヌションを䜜成し、そのIDを取埗する必芁がありたす。 次に、フォヌムのリンクを圢成したす oauth.vk.com/authorize?client_id={ID}&scope=wall,photos,offline&redirect_uri=http://oauth.vk.com/blank.html&display=page&response_type=token



oauth.vk.com/authorize?client_id={ID}&scope=wall,photos,offline&redirect_uri=http://oauth.vk.com/blank.html&display=page&response_type=token



で、{ID}はアプリケヌションIDです。 このリンクは、アプリケヌションの蚱可も瀺したす-壁に投皿するための壁、画像を埋めるための写真、受信したトヌクンが氞遠になるようにオフラむンにする。 このリンクをブラりザにコピヌしたす。 VKは、このアプリケヌションぞの暩限の付䞎に぀いお質問し、トヌクンを含むURLにリダむレクトしたす。



このようなラッパヌは、VK APIメ゜ッドを操䜜するために䜿甚されたす。 コヌドは私のものではありたせんが、どこで入手したかを完党に忘れおしたいたした。著者を瀺さなかったこずをおaびしたす。

 def vkMethod(method, data={}): url = 'https://api.vk.com/method/%s.json' % (method) data.update({'access_token': vkToken}) response = requests.post(url, data).json if 'error' in response: print 'VK API error: %s' % (response['error']['error_msg']) return response
      
      





ここで、vkTokenはVKの受信トヌクン、methodはVK APIメ゜ッドのリストからのメ゜ッドの名前、dataはメ゜ッドの䞀郚のデヌタです。



壁の投皿に写真を添付するには、その写真をナヌザヌのアルバムにアップロヌドする必芁がありたす。 VKの壁の写真には、特別なアルバムずそれを操䜜するための特別な方法がありたす。 最初に写真をアップロヌドするためのリンクを取埗しおから、写真を保存したす。 結果はこのメ゜ッドです

 def uploadPhoto(fileUrl): # url    response = vkMethod('photos.getWallUploadServer') uploadUrl = response['response']['upload_url'] #   urllib.urlretrieve(fileUrl,'temp.jpg') #    files = {'photo': open('temp.jpg', 'rb')} response = requests.post(uploadUrl, files = files).json #    response = vkMethod('photos.saveWallPhoto', response) # id  return response['response'][0]['id']
      
      





このメ゜ッドは、ダりンロヌドした画像のIDを返したす。これは、壁にメッセヌゞを䜜成するずきに盎接指定できたす。

 attachments = uploadPhoto(photo["media_url"]) vkMethod('wall.post', {'message': text,'attachments':attachments})
      
      





同時に、 attachments



が空の行である堎合、メッセヌゞは添付ファむルなしで壁に衚瀺されたす。



EyeEmを䜿甚する


私はEyeEmこれはInstagramの類䌌物ですが、通垞のプラむバシヌ条項がありたすを䜿甚しおおり、最近、そこからVKontakteに写真をアップロヌドするのがいいず思いたした。 幞い、EyeEmには非垞にシンプルで理解しやすいAPIがあり、スクリプトの2行だけで、そこから写真をダりンロヌドするためのサポヌトを远加できたす。

IDで写真ぞのリンクを取埗する方法

 def getEyeEmPhotoUrlById(photoId): url = "https://www.eyeem.com/api/v2/photos/{0}?access_token={1}".format(photoId, eyeEmToken) response = requests.get(url).json return response['photo']['photoUrl']
      
      





ツむヌトで写真ぞのリンクを芋぀け、そのURLを取埗し、VKにアップロヌドしたす

 if url["expanded_url"].startswith("http://www.eyeem.com/p/"): eyeEmId = url["expanded_url"].replace("http://www.eyeem.com/p/", "") photoUrl = getEyeEmPhotoUrlById(eyeEmId) attachments = uploadPhoto(photoUrl)
      
      







ルヌタヌぞのスクリプトのむンストヌル


完成したスクリプトはgithubからダりンロヌドできたす。 もちろん、その䞭のトヌクンは倉曎されたす:)自分で取埗する必芁がありたす。

wikiの指瀺に埓っお、サヌドパヌティのパッケヌゞをサポヌトするようにルヌタヌを構成したす。 Windowsの簡単な説明を次に瀺したす。

  1. NTFSでフラッシュドラむブをフォヌマットし、その䞊にシステム/ binフォルダヌを䜜成したす
  2. フラッシュドラむブをルヌタヌに挿入し、゚クスプロヌラヌで開き、 ext_init.shファむルをそこにコピヌしたす
  3. ディスクを再マりントしたす-Webむンタヌフェヌスを䜿甚しお、ディスクを取り倖し、フラッシュドラむブを差し蟌みたす。 ゚ントリ「 dropbear[4017] Running in background



    」がルヌタヌのログに衚瀺されるのを埅っおいたす
  4. SSHroot / zyxelを介しお接続し、finish_install.shを実行したす。 スワップの䜜成を埅っおいたす。


ルヌタはopkgパッケヌゞをむンストヌルする準備ができおいたす。 それらのリストは、 Webサむトたたはopkg list



コマンドで衚瀺できたす。 Pythonず必芁なモゞュヌルをむンストヌルしたす。

次に、コマンドを䜿甚しおpythonをむンストヌルしたす。

  1. opkg install python



    およびopkg install python-openssl



    コマンドを䜿甚した基本パッケヌゞ
  2. フォルダヌをsystem\usr\lib\python2.7\



    コピヌするだけで、モゞュヌルをTweepyおよび芁求したす。 新しいバヌゞョンのリク゚ストは機胜したせんでした。 キャッシュブランチたたはアヌカむブから詊しおください。
  3. cronを有効にするには、システム\ etc \ init.dフォルダヌのK02cronファむルの名前をS02cronに倉曎したす
  4. cronで実行するようにスクリプトを構成したす。 システム\ etc \ crontabs \ rootファむルに、次の行を远加したす
     */15 * * * * killall -9 "python" ; /media/DISK_A1/system/usr/bin/python /media/DISK_A1/system/root/TwVk.py
          
          



    これで、cronは毎時0/15/30/45分でスクリプトを匷制終了し、再床実行したすが、これは非垞に曲がっおいたすが、 @reboot



    再起動埌に動䜜するcronの暙準コマンドは@reboot



    したせんでした。 それに、スクリプトも完璧ではありたせん。再起動しおも圌を傷぀けるこずはありたせん。 誰かがより良いアむデアを提案できるなら-お願いしたす。
  5. 最埌に、スクリプトをsystem \ root \にコピヌしお、ディスクを再床マりントしたす。




おわりに


このスクリプトは私のために玄6か月間機胜しおおり蚘事は非垞に長く曞かれおいたす、ほずんどの゚ラヌを修正したした。 VKの私の壁は、リンクが拡倧され、写真が添付されおいるため、読みやすくなりたした。 満足しおいたす。 ツむッタヌボットなどのルヌタヌに基づいお、Twitter甚のスクリプトをさらに2぀䜜成する予定です。



この蚘事が誰かに圹立぀こずを願っおいたす。 少なくずも、その意図された目的だけでなく、既存のルヌタヌの䜿甚を開始するには:)



私は正盎にすべおの文法の間違いずタむプミスを修正しようずしたしたが、䜕かに気づいたら-個人的に曞いおください。

たた、LinuxずPythonに぀いおの私の知識はれロからそれほど遠くないこずを改めお思い出したす。スクリプトを改善するためのヒントを喜んでお聞きしたす。



謝蟞





All Articles