[shell] ブログランキングサイトにコマンドで ping 送信する
2017/05/21 13:00
  • ping 送信とは?

    おさらいっぽくなりますが、 ping を各サービスに通知すると、
    「私のサイトを更新したから見に来てね!」っていう連絡をサービス(ランキングサイトなど)側に
    教えてあげられるわけです。そうすると、早くインデックス登録されたりするわけですね。

    ランキング系サイトの場合は、更新してからそれほどタイムラグなく最新記事を一覧に表示させることが
    できるようになります。

    有名ブログサービスの場合

    Ameblo, livedoor blog, JUGEM などの有名サービスの場合は
    各ランキングサイトに自動で ping が送れるようになる設定箇所があったりしますよね。
    WordPress なんかのCMSを使っている場合もプラグインがあったりして便利ですよね。

    これは、ブログ更新のたびに自動で各サービスに「更新したよ」通知を飛ばしてくれるようにするものです。
    ところが当サイトのように Django で自前で実装したり、
    まあ他のフレームワークを使ってたりしていて、いずれにせよ ping 送信の仕組みなんて導入してない!
    って場合は ping 送信するのが手作業だったり不便極まりないです。(´・ω・`)

    ランキング系のサイトには、 ping の代理申請っていうのがあって、ワンポチするだけなんですが、
    それでも自分から何かアクションを起こさないといけないっていうのはやや面倒なものです。

    そこで、以下のようなスクリプトを組んで、みんな大好き crontab に登録することで自動化しちゃいました。笑

    ping 送信なんてどうせ curl で一撃でしょ?

    そう、きっと curl で何も考えずにリクエスト投げればいいだけだ!
    ってことで

    以下を試してみました。

    # url のところは「人気ブログランキング」の ping 送信先URLです。
    [4to-pics@localhost tools]$ curl http://blog.with2.net/ping.php/xxxx/xxxxx 
    <?xml version="1.0" encoding="utf-8"?>
    <response>
      <error>1</error>
      <message>Ping failed. parameter error. (ブラウザではアクセスできません。ご利用されているブログツールで更新pingの設定を行ってください。)</message>
    </response>
    

    あー、そう。そういうこと?
    特に何も考えずにオプションつけずに実行すると、ブラウザからのアクセスになってしまうようで、だめでした。(とは言え更新はされてるっぽい)

    まあ、適切じゃなさそうだったので次なる手を。

    ping 受信サーバーに xml を送る

    ping 受信サーバーっていうのは乱暴に言うと xml で情報を処理しているっぽいので、
    リクエストも xml 形式で送ることにします。

    おそらく、最新の記事タイトル、コンテンツ、投稿日時、サイト名…などが含まれていればいいはず。
    ちょっとまて。それって ブログの RSS じゃね?(゚∀゚)キタコレ!!

    そうか。じゃぁブログの RSS を ping サーバーちゃんに送りつければいい感じで処理してくれるよねきっと。(゚∀゚)キタコレ!!(2回目
    ってことで早速…

    [4to-pics@localhost tools]$ curl -X 'POST' -H 'Content-Type: text/xml; charset=utf-8' -d "`curl http://4to.pics/article/rss/`" http://blog.with2.net/ping.php/xxxx/xxxxx 
    
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100 54378    0 54378    0     0   376k      0 --:--:-- --:--:-- --:--:--  624k
    <?xml version="1.0" encoding="UTF-8"?>
    <methodResponse>
      <params>
        <param>
          <value>
            <struct>
              <member>
                <name>flerror</name>
                <value>
                  <boolean>0</boolean>
                </value>
              </member>
              <member>
                <name>message</name>
                <value>Thanks for the ping</value>
              </member>
            </struct>
          </value>
        </param>
      </params>
    </methodResponse>
    

    ほう。無事できた!できた!ヽ(=´▽`=)ノ

    ワンライナーなのでちょっとだけ補足します。

    まず、 -d の中身ですが、こちらは POST する中身を取得しています。RSS フィード(xml)を -d に入力したかったので、 curl で僕のサイトの rss フィードの URL を叩いて xml を取得しています。これで、 ブログランキングの ping 送信先 URL に最新の RSS を送信できます。

    あとはまぁ、ヘッダに xml 形式ですよって伝えたり、文字コードを utf-8 にしたりしています。
    flerror があるのがちょっと気になりますが、 value0 になっていること、メッセージに Thanks for the ping とあることから、無事に処理されたのだと思われます。
    おそらく、何かしらのエラーがあったら、 flerror が違う値を返すのではないかと。
    参考: Fumy RSS & Atom Maker

    ワンライナーをシェルスクリプトにしてみる…

    可読性が少々悪い?のでシェルスクリプトにしてみました。

    ping_blog.sh

    #!/bin/sh
    
    # ping 送信先 URL
    PING_URL='http://blog.with2.net/ping.php/xxxx/xxxxx'
    
    # RSS Feed の URL
    FEED_URL='http://4to.pics/article/rss/'
    
    curl -X 'POST' -H 'Content-Type: text/xml; charset=utf-8' -d "`curl $FEED_URL`" $PING_URL
    

    $FEED_URL, $PING_URL を引数に取れるようにしてあげるともっといいと思います。
    これだと一箇所の ping サーバーにしか対応できませんが、まあ割と簡単に複数サーバーにも簡単に対応させられると思います。

    以上、ランキングサイトにコマンドで ping を送信する方法でした!

    人気ブログランキングへ ブログランキング・にほんブログ村へ
    ↑応援よろしくお願いします!m(_ _)m

  • <2017/05/21 13:00>
  • ツール
  • shellscriptツールping送信ブログ更新通知自動化ワンライナーcurlxml
  • 新しい記事へ
    macOS Sierra の SSH で、秘密鍵のパスフレーズを毎回聞かれるときの対策

    古い記事へ
    ブロガーさんにおすすめっぽい楽天カフェに来ました。

profile picture

自己紹介的な何か

@wkmettyでついったーやってます。時々。 6年間勤めたゲーム会社を2018年2月に退職しフリーランスのプログラマに。 WordPress Core, WP-CLI コントリビューター。 お仕事募集中です。