プログラミングとは何ぞ?からTwitterアプリを作るまでのほにゃらら


こんにちは。
最近、Pythonを触り始めた糸凪邑でございます。

前々から「AI関連もいずれは手を出してみたいなー」とかぼんやり思ってたのですが、ちょっとずつ勉強をはじめました。

んで、ふとした思いつきからTwitterAPIを使った自動ツールを作ってみたので、今回はそれについて記事にしてみました。

といっても、プログラマの方向けには書きません。
そういう記事はいくらでもありますし。
そもそも僕みたいな初心者がプロに向けて書くことなんて無いです。

なので、今回は非プログラマ向け。
特に「プログラミングに興味があるけど何やったらいいかわからないから手を出しきれない方」に向けての記事です。

テーマは"プログラミングをやったことがない人が0からTwitterの自動ツールを作れるようになるまでにすべきこと"

目標とするのは"何かを作る技術の修得"というより、"何かを作れるような自分になる"ことです。
0から何かしらの成果物を手にするまでの流れを、実践を兼ねて書きます。

とはいえ、手取り足取り、0から10までのステップをいちいち書き連ねることはしません。
そんなの意味が無いですし。

なので、もしそういう「勉強の仕方」に興味がある場合はちょっと寄っていっていただいて。
そんでもって、気が向いたら勢いのままに試してもらえればなと。

先に言っておきますが、間違っても「コピペでおk」みたいなことも書きません。
あくまでお勉強の流れをつかむのが目的。
結果だけをお求めの方には一切役に立ちませんので、あしからず。



そんなこんなで今回の流れはこちらです。
以上。
シンプル。簡単。

では、参りましょう。


プログラミングって何ぞ?
さっそくPythonの学習を・・・といきたいのですが、その前に。

そもそもプログラミングって何でしょう。

Google先生に「プログラミング」についてお伺いを立ててみると、最初にWikipediaの記事が出てきます。

「プログラミング (コンピュータ) - Wikipedia」
https://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0_(%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF)

なんか長々と書いてありますね。
正直、専門用語だらけで読むのも辛いですが大丈夫です。

実際、この記事は「プログラミングとは何か?」って問いについては書かれてませんので、ほとんど読まなくていいです。
プログラミングを知っている人が、プログラミングを知っている人向けに専門用語についてだらだら書いているだけですから。

プログラミングが何かを知りたい人が読むべき大事な部分はページの冒頭。

"コンピュータのプログラミング(英: programming)とは、コンピュータプログラムを作成することにより、人間の意図した処理を行うようにコンピュータに指示を与える行為である。"

ここだけです。

これだけじゃちょっと分かり辛いと思いますので、こっからは例え話を交えて説明していきます。


ご覧ください。
ここに何処かで見たことのあるロボットがいます。


ロボットというのはコンピューターの一種の形です。

彼らは色んな機能を持っています。
「歩く」だったり、「ジャンプ」だったり、便利な「電卓」機能、「パンチ」や「キック」などの攻撃や、果ては創られしものたちの悲しき定めである「自爆」みたいな機能もついているとします。
そんな彼らに命令して色んなことをさせたいのですが、残念なことに彼らには僕らの言葉はわかりません。
それどころか「abcde」や「あいうえお」すらもわかりません。

彼らに理解できるのは0と1だけ。
彼らに命令するためには、0と1で書かれた命令をしなければいけません。

彼らに付属している説明書には、「この組み合わせの命令が来た時にはこの部分を動かす」といったルールが記されています。
このルールにしたがって、命令してみましょう。


例えば上の彼に「パンチ」という動作をさせたいとします。

しかし、説明書にはパンチという項目はありません。
あるのはどの関節を回す、どのワイヤーを縮める、緩める、などといった細かな命令だけ。
これらを組み合わせて命令を考えることになります。
紆余曲折を経て、このロボットに「パンチ」を実行させるためにはこういう命令を下せばいいことがわかりました。

「11000011010001 11000011110011 11000011000001」
(※適当です)

はっきり言ってわけがわかりませんが、実際に命令してみると、下手くそながら見事パンチらしき動きをしました。

あーよかった。
めでたしめでたし。


・・・ではなく。

現状、彼にできるのは目の前に拳を突き出すことだけ。
下手くそなパンチをいくら繰り出せたところで、大した役には立ちません。
砕きたい岩があるときはその前まで自分たちで動かさなければいけませんし、硬い岩は気合の入ったパンチじゃないと砕けません。
他の場面、例えば襲ってくる獣を討ち滅ぼすためには移動や回避、停止といった命令をさせなければなりません。

そのために動かす部分、向き、距離や力の指定、条件を0と1で命令していきます。





01000101010010101010100101010111001010101001010101100101010010100101010010100101010011010100101101001010010100010101001010101010010101011100101010100101010110010101001010010101001010010101001101010010110100101001010001010100101010101001010101110010101010010101011001010100101001010100101001010100110101001011010010100101000101010010101010100101010111001010101001010101100101010010100101010010100101010011010100101101001010010100010101001010101010010101011100101010100101010110010101001010010101001010010101001101010010110100101001010001010100101010101001010101110010101010010101011001010100101001010100101001010100110101001011010010010001010100101010101001010101110010101010010101011001010100101001010100101001010100110101001011010010100101000101010010101010100101010111001010101001010101100101010010100101010010100101010011010100101101001010010100010101001010101010010101011100101010100101010110010101001010010101001010010101001101010010110100101001010001010100101010101001010101110010101010010101011001010100101001010100101001010100110101001011010010100101000101010010101010100101010111001010101001010101100101010010100101010010100101010011010100101101001010010100010101001010101010010101011100101010100101010110010101001010010101001010010101001101010010110100101001010001010100101010101001010101110010101010010101011001010100101001010100101001010100110101001011010010100101000101010010101010100101010111001010101001010101100101010010100101010010100101010011010100101101001010010100010101001010101010010101011100101010100101010110010101001010010101001010010101001101010010110100101001010001010100101010101001010101110010101010010101011001010100101001010100101001010100110101001011010010100101000101010010101010100101010111001010101001010101100101010010100101010010100101010011010100101101001010011001010001010100101010101001010101110010101010010101011001010100101001010100101001010100110101001011010010100101000101010010101010100101010111001010101001010101100101010010100101010010100101010011010100101101001010010100010101001010101010010101011100101010100101010110010101001010010101001010010101001101010010110100010001010100101010101001010101110010101010010101011001010100101001010100101001010100110101001011010010100110100101000101010010101010100101010111001010101001010101100101010010100101010010100101010011010100101101001010010100010101001010101010010101011100101010100101010001010100101010101001010101110010101010010101011001010100101001010100101001010100110101001011010010100101011001010100101001010100101001010100110101001011010010100101000101010010101010100101010111001010101001010101100101010010100101010010100101010011010100101101010001010100101010101001010101110010101010010101011001010100101001010100101001010100110101001011010010100100101001010001010100101010101001010101110010101010010101011001010100101001010100101001010100110101001011010010100101000101010010101010100101010111001010101001010001010100101010101001010101110010101010010101011001010100101001010100101001010100110101001011010010100101010110010101001010010101001010010101001101010010110100101001010001010100101010101001010101110010101010010101011001010100101001010100101001010100110101001011010010100101000101010010101010100101010111001010101001010101100101010010100101010010100101010011010100101101001010010100010101001010101010010101011100101010100101010110010101001010010101001010010101001101010010110100101001010001010100101010101001010101110010101010010101011001010100101001010100101001010100110101001001000101010010101010100101010111001010101001010101100101010010100101010010100101010011010100101101001010011101001010010100010101001010101010010101011100101010100101010110010101001010010101001010010101001101010010110100101001010001010100101010101001010101110010101010010101011001010100101001010100101001010100110101001011010010100101000101010010101010100101010111001010101001010101100101010010100101010010100101010011010100101101001010010100010101001010101010010101011100101010100101010110010101001010010101001010010101001101010010110100101001010001010100101010101001010101110010100100010101001010101010010101011100101010100101010110010101001010010101001010010101001101010010110100101001101001010101100101010010100101010010100101010011010100101101001010010100010101001010101010010101011100101010100101010110010101001010010101001010010101001101010010110100101001010001010100101010101001010101110010101010010101011001010100101001010100101001010100110101001011010010100101000101010010101010100101010111001001000101010010101010100101010111001010101001010101100101010010100101010010100101010011010100101101001010011010100101010110010101001010010101001010010101001101010010110100101001010001010100101010101001010101110010101010010101011001010100101001010100101001010100110101001011010010100101000101010010101010100101010111001010101001010101100101010010100101010010100101010011010100101101001010010100010101001010101010010101011100101010100101010110010101001010010101001010010101001101010010110100101001



はい。

というわけでね、先人たちは、ある程度命令をまとめて、それをロボットに解る形に翻訳して伝える「翻訳機」を作ることにしました。

例えば「直進:5m:右腕:パンチ:マッハ2」という命令を翻訳者に伝えると、それを0と1の形に翻訳してくれます。
あとは翻訳された命令をロボットに読み込ませると、

何ということでしょう・・・。

命令通り右方向にマッハ2でパンチを繰り出し、見事向かいの家に大穴を開けました。


ゲシュタルト崩壊を起こしそうな0と1の世界が、たった一文に圧縮されました。
素晴らしい。

これでロボットに対する命令も簡単ですね。
モノを運んだり、自分を乗せて走ったりするのもちょろいですし、頑張って命令を組み合わせれば壊してしまった壁の補修もなんとかできそうです。

ただし、翻訳機もロボットと同じくコンピューターの一種ですので、僕らが会話するように自由な形では翻訳してくれません。
そこには翻訳機特有のルールがあります。
でも0と1を学ぶよりは僕らに理解できる言葉を使って組み立てられますので、簡単ですね。


これが「プログラミング」の意味するところです。

プログラミングという言葉の定義は上で引用したように

"コンピュータのプログラミング(英: programming)とは、コンピュータプログラムを作成することにより、人間の意図した処理を行うようにコンピュータに指示を与える行為である。"

となりますので、例における"0と1の命令"も、"翻訳機を通した命令"も、どちらもプログラミングであることには変わりはありません。

ですが、普段使われる「プログラミング」という言葉は、"目的に応じて、数多あるコンピューターと翻訳機を選び、その翻訳機を通してロボットに命令を下すこと"だと思ってください。

つまり、"プログラミングを学ぶ"というのは、"コンピューターや翻訳機に命令する方法を学ぶ"ということであり、それが一般的に意味するものは"コンピューターに命令を下すための翻訳機に命令するためのルールや言語を学ぶこと"なんだ、とでも認識しておけば大丈夫です。

以上がコンピューターとプログラミングについての端折りまくりかつ大雑把な説明となります。
(※この説明はあくまでイメージなので、専門的な部分をお望みの方は調べてください)


プログラミング言語「Python」の学習
で、ここからがようやく本題。

プログラミングというものを学ぶ際、最初の方に出てくるものに「プログラミング言語」という言葉がありますが、これはコンピューターに命令するための翻訳機に対応した"言語"のことです。

日本語を翻訳する機械にインド語で命令しても動きませんよね?
それと同じで、それぞれの翻訳機にはそれとセットになった言語があります。
それが「プログラミング言語」です。

このプログラミング言語っていうものには色んな種類があります。

「プログラミング言語一覧 - Wikipedia」
https://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E%E4%B8%80%E8%A6%A7

数百個ほどありますね。
これは上の例で例えるなら、翻訳機の数(=翻訳のルール)が数百種類あるってことです。

なんでこんなにあるのか、ってツッコミたいところですが、一言で言えば進歩の結果でしょう。
ロボット(コンピューター)が進化すれば、より効率の良い命令の仕方が生まれ、それとともに翻訳機に対する命令の仕方も進化していった。

そんな感じです。
書き方も、現代に近付くにつれて人間の言葉っぽくなっています。

ちなみにプログラミング言語はそれぞれに対する命令の仕方が異なるのと同時に、コンピューターに対する翻訳の中身とその結果も異なります。

例えば「走れ」という命令をする場合。
Aというプログラミング言語を使う場合、「走れ:早く」「走れ:ゆっくり」「走れ:ぐねぐね」という三択から選べるけど、Bというプログラミング言語では「走る」という機能がそもそも無く、「右足を何センチ上げる」「右足を前に何センチ出す」「右足を下ろす」というような、ある程度小さな命令を組み合わせなければ走らせることができなかったりします。

ぱっと見、Aが良くてBが駄目な言語に見えるのですが、これは一概に良し悪しを判断することはできません。

例えば、あるロボットを早く走らせたい時、Aという言語では「走れ:早く」という命令がその限界となりますが、Bの言語では小さな命令を組み合わせることで、そのロボットの性能の限界を引き出すことができます。

なので、用途に応じてプログラミング言語は選ぶ必要があります。


そんな数多あるプログラミング言語の中で今回学ぶのは「Python」というものです。

Pythonの特徴はわかりやすくて、学びやすくて、機能が多いこと。
ロボットを走らせるために、"右足動かして前やって云々"みたいな細々した命令を組み立てる必要はありません。
「走れ」と言ったら走ります。
シンプルでわかりやすいです。

また、他の人の書いたものを参考にしやすいです。
厳密に言えば"読みやすい"です。
例えば、他の言語だと「走れ」を

「走れ」

「は

れ」

「走」

みたいに好き勝手書けたりしますが、Pythonはそういうのをほとんど許しません。
自分のルールで書こうとすると「書き方が違う。出直してこい」と怒られます。
Pythonが許した書き方以外は全てはねのけます。
ということは、「ここわからないなー」って思って調べた時、誰かの書いたものを読んで「・・・何て書いてあるのかわからないんだけど」ってことが少なくて済みます。
つまり、学びやすくもあるのです。

Pythonの良さはそれだけじゃありません。
わかりやすくて学びやすい、にもかかわらず、機能が多いです。
GoogleやDropbox、Youtube、InstagramといったメジャーなWebサービスや昨今巷を賑わせているAI分野でも使われたりと、実用性も保証済み。
何と素晴らしい。

デメリットとしては、遅いこと。
プログラミング言語は大雑把に分けて2種類の形があります。
"あらかじめ命令文を翻訳してもらい、実際に使うときにその命令をコンピューターに渡すもの"と"使うときに翻訳と命令を両方やってもらうもの"です。
(※実際には両方を組み合わせていたりします)

どちらも一長一短あるのですが、速度で言えばあらかじめ翻訳しておく前者の方が速いです。

で、Pythonは後者です。

なので、速さが求められる作業では敬遠されがちです。
とはいえ、そんな圧倒的な速度が必要な場面は普段の作業ではなかなか訪れませんので、気にしなくても大丈夫です。
速さが必要な際には別の言語を学べばいいでしょう。

ちなみにプログラミング言語は他の言語の機能や文法を取り入れながら変化したり、新しい言語が生まれたりを繰り返してきたので、案外そのルール(書き方)が似ています。
「方言みたいなもの」と例えられるように、何かしらの言語を一つ学んでしまえば(作られた時代の近い)他の言語を学ぶのにはさほど苦労しません。
慣れた人だと、学び始めてその日のうちに書けるようになるとか。

そういう意味でもあまり心配なさらないでください。


そんなPythonの学習方法ですが、基礎はこちらの学習サイトで身につけられます。

「初心者でも楽しく学べるプログラミング入門サービス | paizaラーニング」
https://paiza.jp/works

「Progate | プログラミングの入門なら基礎から学べるProgate[プロゲート]」
http://prog-8.com

「Aidemy | 10秒で始めるAIプログラミング学習サービスAidemy[アイデミー]」
https://aidemy.net/

基礎部分だけなら無料プランで大丈夫です。
でも、やる気があるなら有料プランに入ってみるのも全然あり。
月々1000円とかなんで、投資対象としては非常に優秀だと思います。

ガチャ引いたり、よくわからんペラい本買ったり身体に悪い食い物貪るのに違和感を感じる位ならちょろっと払ってみればよろしいかと。

とりあえず基礎講座をやってみて、自分の中で完全に納得できるまで繰り返してみましょう。


ここでちょっと大事な余談ですが、Pythonには「Python2」と「Python3」の2種類があります。(それぞれPython2.xとPython3.xと表記)

この2つの間には互換性の問題があり、Python2で書かれたものがPython3では動かなかったり、その逆もまた然りな事情があります。
じゃあ、どっちもやる必要があるのか、ってお話ですが、古いものは新しいものに置き換わっていきますから、あえて古い方を学ぶ必要は無いでしょう。
特殊な事情がない限り、新しいPython3の方を学んでおけばいいと思います。

Pythonのインストールを始めとした環境構築に関してはWindows,Mac,Linuxでそれぞれ違いますので、自分のパソコンと相談して調べましょう。
うまく行かない時はひたすらGoogle博士にお伺いを立てたりしましょう。



PythonでTwitterに触れる方法とそのルール

Pythonの基礎を学んで自分のコンピューターに環境構築したあとは、PythonでTwitterを扱う方法について。

PythonにはTwitterを便利に使うためのライブラリがあります。
代表的なのは「python-twitter」、「twitter」、「tweepy」などがありますが、ここでは「python-twitter」を使います。

「python-twitter」の使い方はこちらを参考にしました。

「python-twitterを利用して、pythonでTwitterを操作する。」
https://qiita.com/ti-ginkgo/items/90914db1dc7e229c69c7


「twitter」を使う場合はこちら。

「Python3で簡単にtwitterに投稿する」
https://qiita.com/shtnkgm/items/cc55be0e09b484ce8e43

「tweepy」に関しては、Python3では使えないらしいので載せません。
気になる方は調べてくだされ。



プログラムを書く
Twitterの自動化に関するルールやAPIの取得、利用方法関してはこれらを参照。

「Python3でTwitterAPIを使い方をどのサイトにも負けないくらい丁寧に解説してみた」
https://cre8cre8.com/python/twitter-api.htm

「GET users/search — Twitter Developers」
https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/get-users-search

「Using standard search — Twitter Developers」
https://developer.twitter.com/en/docs/tweets/search/guides/standard-operators

「自動化ルール」
https://help.twitter.com/ja/rules-and-policies/twitter-automation

「API reference index — Twitter Developers」
https://developer.twitter.com/en/docs/api-reference-index


ライブラリに関してもっと情報が欲しい場合はGoogle検索で。
「python twitter」とかで調べれば大量に出てきます。
いらない情報に関しては「python twitter -tweepy」のように、"-除外キーワード"とすれば外して検索できますので色々お試しを。



実行と自動化
コードを書き終わったら、あとは実行するだけです。
これでプログラムを実行するたびにふぁぼったりふぉろーしたりその他諸々を勝手にやってくれます。

ですが、これでは完全に自動ってわけじゃありません。
いちいちプログラムを実行するのが手間です。

そのために、自動で実行するための仕組みがあります。
それが「cron」と呼ばれるものです。

「cron の設定ガイド」
https://www.express.nec.co.jp/linux/distributions/knowledge/system/crond.html

「cronの設定方法」
https://qiita.com/hikouki/items/e744b3a4d356d2af12cf

WindowsやMacでこれに該当するものが何なのかわかりませんので、それらを使っている場合は調べてみてくださいませ。


以上が、PythonでTwitterの自動ツールを作る方法です。

今回はPythonを使いましたが、もちろん他の言語でも作れます。
その場合は各自調べてみてください。

また、プログラミングに限った話じゃないですが、専門性のあるものは作っていくなかでつまずくことが死ぬほど出てくると思います。

プログラミングの場合、エラーが出たらそのエラーコードをそのままor一部切り取って検索フォームに貼り付けて検索したら案外出てきます。
ただ、海外のサイトであることがままあるので、翻訳サイトもお供に連れて調べましょう。

んで、どうしてもわけわからなくなったら、一旦時間を置きましょう。
たぶんインプット過多(情報過多)です。
食べ過ぎたあとに胃腸の消化が必要なように、過度の情報は脳が消化するための時間を必要とします。
授業でわからなかった問題が、何日かしたあとにふとわかるようになったことってないですか?
それと同じです。

大事なのは諦めないけれど、適当にやることです。
つまるところはノリと気合。
どうしても楽しくなければやめるのも1つの手。

そんな感じでがんばりましょう。

ではまた。



おまけ
今回僕が書いたコードです。
まだPython初学者ゆえ雑なところは多々あるかと思いますが、何かしらの役に立てれば幸いです。

おかしな所があればご指摘くださいませ。

import time
import twitter
import random

CONSUMER_KEY = 'YOUR_CONSUMER_KEY'
CONSUMER_SECRET = 'YOUR_CONSUMER_SECRET'
ACCESS_TOKEN = 'YOUR_ACCESS_TOKEN'
ACCESS_TOKEN_SECRET = 'YOUR_ACCESS_TOKEN_SECRET'
tweet_array = [
  'Test',
  'test',
  'てすと',
  'テスト'
]

interval = 3
fav_rt_num = 3
unfollow_num = 30
follow_num = 30
follow_back_num = 30
fav_rt_search_term = 'TargerKeywords -filter:replies -RT'
fav_rt_search_result_type = 'recent'
follow_search_term = 'TargetKeywords -filter:replies -RT'
follow_result_type = 'recent'

api = twitter.Api(CONSUMER_KEY, CONSUMER_SECRET,
                  ACCESS_TOKEN, ACCESS_TOKEN_SECRET)



# [AutoTweet]
api.PostUpdate(random.choice(tweet_array))



#  [AutoFav]
#  [AutoRetweet]
fav_rt_search_result = api.GetSearch(term=fav_rt_search_term, count=fav_rt_num, result_type=fav_rt_search_result_type)

for frsr in fav_rt_search_result:
    api.CreateFavorite(status_id=frsr.id)
    api.PostRetweet(status_id=frsr.id)
    time.sleep(interval)



# [AutoUnfollow]
# [AutoFollowBack]
followers = api.GetFollowers()
friends = api.GetFriends()
follow_back_count = 0
unfollow_count = 0

#[Unfollow]
while unfollow_count < unfollow_num :
    friend = random.choice(friends)
 
    if friend not in followers:
        api.DestroyFriendship(screen_name=friend.screen_name)
        unfollow_count+=1
        time.sleep(interval)

#[FollowBack]
while follow_back_count < follow_back_num:
    follower = random.choice(followers)

    if follower not in friends:
        api.CreateFriendship(screen_name=follower.screen_name)
        follow_back_count += 1
        time.sleep(interval)



# [AutoFollow]
follow_search_result = api.GetSearch(term=follow_search_term, count=follow_num, result_type=follow_result_type)

for fsr in follow_search_result:
    new_friend_name = fsr.user.screen_name
    api.CreateFriendship(screen_name=new_friend_name)
    time.sleep(interval)


では。


コメント