友人の特定ツイートにクソリプを自動的に送りたい
(Python 2.7.13)
Twitter APIを使ってみたという記事は山ほどあるので、今更という感じだが
成果物
特定のユーザが"二郎"という単語を含んだツイートをすると、自動的に二郎に誘うリプを送る
(二郎:一部の人が大好きな高カロリーラーメン)
Twitter API の準備
これも多くの人が解説してくれてるので、そちらを参照しよう
Twitterアプリケーションの作成(Consumer key、Consumer secret、Access token、Access token secretの確認方法)
以下の4つの情報が取得できればOK * Consumer Key (API Key) * Consumer Secret (API Secret) * Access Token * Access Token Secret
Python ライブラリ
わざわざライブラリを使うまでもないとは思うが、圧倒的に楽なので
様々なライブラリが存在するが、今回はこちらを用いる
GitHub - sixohsix/twitter: Python Twitter API
以下のコマンドでインストールする
% pip install twitter
基本的には以下のような形で用いる
各認証情報は先ほど取得したものに置き換える
また、タイムラインなどは辞書型で取得される
from twitter import * # 認証情報 CONSUMER_KEY = "Consumer Key" CONSUMER_SECRET = "Consumer Secret" ACCESS_TOKEN = "Access Token" ACCESS_TOKEN_SECRET = "Access Token Secret" twitter = Twitter( auth=OAuth(ACCESS_TOKEN, ACCESS_TOKEN_SECRET, CONSUMER_KEY, CONSUMER_SECRET) ) home_timeline = twitter.statuses.home_timeline() # ホームのタイムラインを取得(デフォルトは20件) user_timeline = twitter.statuses.user_timeline(screen_name="@xxxx") # 指定したユーザのタイムラインを取得 twitter.statuses.update(status="hello") # "hello" とつぶやく
指定できるパラメータの情報などはこの辺りで確認しよう
POST statuses/update — Twitter Developers
特定のツイートに対してリプをする
各ツイートにはid
が設定されており、ツイートの際にこのidを指定することで、特定のツイートにリプが返せる
ユーザ@xxxx のツイートid yyyyにリプするときは以下のようにする
status_id = "yyyy" twitter.statuses.update(status="@xxxx hello", in_reply_to_status_id=status_id)
基本的な流れは、
- ユーザのタイムラインを取得
- 取得したツイートのテキストにキーワードが含まれているかを判定
- リプ済IDリストを確認し、まだリプしていないならクソリプし、IDをリストに追加
- 1分ほど待って、1.に戻る
これを繰り返すことで、自動的にチェックしてリプする
同じツイートにリプを返さないように、一度リプしたものは除外する処理が必要
# coding:utf-8 from twitter import * import time # 認証情報 CONSUMER_KEY = "Consumer Key" CONSUMER_SECRET = "Consumer Secret" ACCESS_TOKEN = "Access Token" ACCESS_TOKEN_SECRET = "Access Token Secret" SCREEN_NAME = "@xxxx" twitter = Twitter(auth=OAuth(ACCESS_TOKEN, ACCESS_TOKEN_SECRET, CONSUMER_KEY, CONSUMER_SECRET)) status_id_list = [] # 同じツイートにリプしないように、リプしたidを記録しておく while True: # secreen_nameのユーザのタイムラインを取得 tweet_list = twitter.statuses.user_timeline(screen_name=SCREEN_NAME) # 二郎に関するツイートをしていた場合、クソリプを送る for tweet in tweet_list: if tweet["text"].find(u"二郎") != -1: # 探せなかった場合は、-1が帰ってくる status_id = str(tweet["id"]) # まだリプしていないツイートがあったらリプする if status_id not in status_id_list: twitter.statuses.update(status="だったら、二郎行こうぜ", in_reply_to_status_id=status_id) status_id_list.append(status_id) if len(status_id_list) >= 20: # 20以上保持する必要はないので、必要に応じて減らす status_id_list = status_id_list[1:] time.sleep(60)
プログラムを動かしっぱなしにすることを想定しているため、time
で制御している
cron
などで定期的にプログラムを実行させる方法もある
(こちらの場合は、IDリストを外部ファイルに書き出す必要がある)
GitHubへのプッシュとその周辺
githubにプッシュするまでの流れ辺りをいい加減覚えたい
まずはGithubでリポジトリを新規作成し、URLを取得する
Gitで有効になっている設定を確認し、編集する
Gitには3種類の設定が存在する。
名称 | 内容 |
---|---|
system | Gitシステム全体の設定 |
global | 対象となるユーザの設定(ユーザ名、メールアドレス) |
local | ローカルリポジトリ毎の設定 |
設定を確認するためには以下のようなコマンドを用いる
% git config --list % git config --global --list # global 設定のみを参照 % git config --local --list # local 設定のみを参照
まずはglobalの設定を行っておく
% git config --global user.name "ユーザ名" % git config --global user.email "メールアドレス"
ローカルリポジトリ編
% cd [対象ディレクトリ]
% git init
ファイルをコミット待ち状態にする
git add -A と git add . と git add -u の違い - Qiita
% git add [ファイル名] # 対象のファイルをaddする % git add . # 削除されていない部分を全てaddする % git add -u # 変更があった部分のみをaddする % git add -A # . OR -u で対象となる全てをaddする
ファイルをコミットする
% git commit -m "コメント"
ログを確認する
% git log
リモートリポジトリ編
ファイルがコミットできたら、Githubにプッシュする
まずはプッシュ先のURLを指定する(local設定ファイルに書き込まれるので、一度だけで良い)
% git remote add origin [URL]
プッシュする
% git push -u origin master
GitHubのコミット履歴に意図しない表示があるとき
違う環境からプッシュしようとしたり、最初のglobal設定を忘れていると、
commited with 名前
みたいな感じで本名が表示されたりすることがある
これはPCのアカウントをそのまま引っ張ってしまうことで発生する(MacOS限定の話?)
これはセキュリティ的によろしくない
(とは言っても、Gitというのは履歴を残すためのものなので、ある意味で間違いでは無い)
大量のコミット書き換えはgit filter-branch
コマンドで行う
git filter-branch -f --commit-filter ' GIT_AUTHOR_NAME=[名前]; GIT_AUTHOR_EMAIL=[メールアドレス]; GIT_COMMITTER_NAME=[名前]; GIT_COMMITTER_EMAIL=[メールアドレス]; git commit-tree "$@"; ' HEAD
Author と Commiter の2種類が存在し、これらに齟齬があるときに上記のような事象が生じる
そのため、どちらも一括で書き換えてしまう
これをプッシュしてGitHubに反映させる
% git push -f -u origin master
CTFのためのsqlmap使い方まとめ
sqlmap とは SQLインジェクションの有名なテストツール
実際の攻撃などにも利用されてるとかされてないとか...
とっても簡単に使えるので、CTFなどでは強力なツールとなりそう(悪用は厳禁)
公式
sqlmap: automatic SQL injection and database takeover tool
ドキュメント
github.com
- Full support for MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase, SAP MaxDB, HSQLDB and Informix database management systems.
- Full support for six SQL injection techniques: boolean-based blind, time-based blind, error-based, UNION query-based, stacked queries and out-of-band.
...
この辺りの文言を見るだけでやばい
ダウンロード
git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev
使い方
正直、いろんなところで紹介されてるから言うこともない...
この辺をみとこう
Usage · sqlmapproject/sqlmap Wiki · GitHub
sqlmapでSQLインジェクションの検証 - Qiita
以下のコマンドでデータベース一覧を取得
$ python sqlmap.py -u [URL] --dbs
特定のデータベースからテーブルを取得
$ python sqlmap.py -u [URL] --tables -D [データベース名]
特定のテーブルからカラムを取得
$ python sqlmap.py -u [URL] --columns -D [データベース名] -T [テーブル名]
基本的にはこんな感じの流れ?