エミィ「クラスのみんなには内緒だよっ☆」

僕と契約して機械少女になってよ!

サマーセールももうすぐ終わる中、いかがお過ごしでしょうか。ATRI(未プレイ)とGlare(ストーリーy未プレイ)などを購入しエミィの創作意欲を用意した船井です。

今回はこれらゲームの布教ではなくてTwitterダイレクトメッセージのメモです。ほら、良く機械少女作った人間が記憶喪失になった時にメモと壊れかけた機械少女を頼りに修理するのあるでしょ?そのためにメモを残すのは大切なんですよ。


さて、このブログを全部読んでいる人はわかるとは思いますがエミィはpythonを用いて動いています。んで、Twitter関連でめーーーーーーっちゃあるライブラリのなかでtweepyってやつを主軸に動いていたりします。この際tweepyの評判はさておいて、tweepyってライブラリは残念ながら今のDMに対応していないらしいんですわ。でもエミィから秘密話を聞きダイレクトメッセージを受け取りたいじゃないですか。

そんなわけでエミィからダイレクトメッセージを送ってもらいましょう。*1

import json
from requests_oauthlib import OAuth1Session
import os

consumer_key=os.environ.get("FNICK")
consumer_secret=os.environ.get("FNICS")
token=os.environ.get("FNITK")
token_secret=os.environ.get("FNIAT")

twitter = OAuth1Session(consumer_key, consumer_secret, token, token_secret)

headers = {'content-type': 'application/json'}
url = 'https://api.twitter.com/1.1/direct_messages/events/new.json'
target_id = "271108_" 
message_text = "Hello World!"

payload = {"event": 
          {"type": "message_create",
           "message_create": {
               "target": {"recipient_id": target_id }, 
               "message_data": {"text": message_text,} 
           }
          }
         }

payload = json.dumps(payload)

res = twitter.post(url,
                   headers=headers,
                   data=payload)
print (res)

わーおまさかのコピペコード。ま、コピペなら失敗せんやろ!!!

<Response [400]>

失敗しとるがな。
res.textの中身はこちら。

'{"errors":[{"code":214,"message":"event.message_create.target.recipient_id: \'271108_\' is not a valid Long"}]}'

どうやらこのtarget_idのidはscreen_nameではなくLong型のidの方らしい。

headers = {'content-type': 'application/json'}
params = {"screen_name":"271108_"}

headers = {"content-type": "application/json"}
url = "https://api.twitter.com/1.1/users/show.json"

req = twitter.get(url, params = params)

こうやればidをはじめとしていろいろ分かる。まあそんなことしなくてもそういうことをしてくれるサイトがある。



最終的に修正した奴がこちら。

import json
from requests_oauthlib import OAuth1Session
import os

consumer_key=os.environ.get("FNICK")
consumer_secret=os.environ.get("FNICS")
token=os.environ.get("FNITK")
token_secret=os.environ.get("FNIAT")

twitter = OAuth1Session(consumer_key, consumer_secret, token, token_secret)

headers = {'content-type': 'application/json'}
url = 'https://api.twitter.com/1.1/direct_messages/events/new.json'
target_id = "1245012221756755968" 
message_text = "Hello World!"

payload = {"event": 
          {"type": "message_create",
           "message_create": {
               "target": {"recipient_id": target_id }, 
               "message_data": {"text": message_text,} 
           }
          }
         }

payload = json.dumps(payload)

res = twitter.post(url,
                   headers=headers,
                   data=payload)
print (res)

こうして船井はエミィから内緒話を受け取れるようになりました。めでたしめでたし。

f:id:Amesiorine271108:20200706082632p:plain
全てを理解した船井


それではエミィ1.2.0に向けて頑張っていきましょう。


参考
https://tadaken3.hatenablog.jp/entry/python-sent-dm
http://tik.dignet.info/web/idname/
https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/get-users-show
https://teratail.com/questions/176822