読者です 読者をやめる 読者になる 読者になる

twitter のリストメンバーに一部改変可能なテンプレDMを送る

今度 Splatoon の大会主催するんですけど、それにあたって需要があったので書きました。

したこと

  • Twitterリストのメンバー一覧を取ってくる
  • 登録データをcsvファイルに落として、パースする
  • 登録データを元にTwitterリストのメンバーにDMを送る
  • DM の内容はテンプレだけど、各自異なった内容になる

使ったもの

Python 3.5.1 で書きました。Python むずい。ライブラリは twitter, csv(標準であるらしい、すごい)。

流れ

はじめにcsvファイルを読み込んで一行一行をリストで保存する(csvファイルの1行 = リストの1要素)。そんで、twitterリストのメンバー一覧を持ってきて、あるメンバーがcsvファイルのどこに居るのかを調べて、もし居たらそのひとに DM を送るって形です。こういう形になってるのは、リストにDMを送らなくてもよいユーザがいるからですね。

で、ソースを見ればわかるんですがO(n2)になってて、その原因は登録データでは「さく / li_saku」になっていて、twitterリストのメンバー一覧では単なる「li_saku」なので、リストなめるときにいちいち登録データの中身を全探索してました。あと、大文字小文字が面倒だったのであらかじめ全部小文字にしておきました。

登録データを参照して個別にテンプレのいち部分が違う内容の文章を送りたかったので聞いてみたら、どうやらstr.format()がかなり優秀らしいので、それを使いました。使い方はここ見たほうが早いと思います。めっちゃすごい。便利!!!!!

登録データは次のような感じでした。

受理番号, チーム名, リーダー, NNID, 得意ステ1, 得意ステ2, 不得意ステ1, 不得意ステ2

ソースコード

# coding:utf-8

from twitter import *
import csv

t = Twitter(
            auth = OAuth('ここに', '自分の',
                       'アクセストークンを', '入れる')
           )

ret = t.lists.members(owner_screen_name = "li_saku_ika", slug = "sakurako", count = "100")

csv_file = csv.reader(open('data.csv'), delimiter = ',')
user_data = []
for i in csv_file:
    i[2] = i[2].lower()
    user_data.append(i)
    print(i)

send_text = """
      こんにちは、さくらこ杯運営のさくです。2度送ってしまった方はごめんなさい、完全なミスです。申し訳ありません。
      20時時点でのステージ選択や各情報についての最終確認を行います。
      受理番号:{0[0]}
      チーム名:{0[1]}
      得意ステージ:{0[4]}, {0[5]}
      不得意ステージ:{0[6]}, {0[7]}
      以上で問題ないでしょうか?
      """

for now_user in ret['users']:
    cnt = 0
    finded = False
    now_user['screen_name'] = now_user['screen_name'].lower()
    for s in user_data:
        if s[2].find(now_user['screen_name']) != -1:
            print(now_user['screen_name'], ' finded')
            finded = True
            break
        cnt += 1
    print(cnt, now_user['screen_name'])
    if finded == True:
        t.direct_messages.new(
            user = now_user['screen_name'],
            text = send_text.format(user_data[cnt])
        )