

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>“南船北馬” &#187; urllib</title>
	<atom:link href="http://aoshiman.net/weblog/category/python/urllib/feed/" rel="self" type="application/rss+xml" />
	<link>http://aoshiman.net/weblog</link>
	<description>不定期更新且つ、最新情報に対して常に周回遅れ気味に追っかけているブログです</description>
	<lastBuildDate>Tue, 20 Oct 2009 11:07:15 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>[Python]CORESERVERのSSH登録を自動化する</title>
		<link>http://aoshiman.net/weblog/2009/09/16/coreserver_ssh/</link>
		<comments>http://aoshiman.net/weblog/2009/09/16/coreserver_ssh/#comments</comments>
		<pubDate>Wed, 16 Sep 2009 13:38:53 +0000</pubDate>
		<dc:creator>aoshiman</dc:creator>
				<category><![CDATA[CORESERVER]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[urllib]]></category>

		<guid isPermaLink="false">http://aoshiman.net/weblog/?p=488</guid>
		<description><![CDATA[				このBlogをホスティングしているCORESERVERは手頃で良いんだけど、SSH接続する前にWeb上の管理画面で、SSH接続のためホスト情報をサーバーに登録する必要があり、この作業が結構面倒くさい。一回登録すれば３０日は有効なのだけど、その間に別の場所からSSH接続したいときは登録しなおさなければならない。なにか良い方法はないかなと捜していたら自動登録スクリプトを作成している方々がいました。
				
				coreserverのSSH登録を自動化するスクリプト &#8211; Geek Not Found
				xrea(coreserver) SSHホスト登録スクリプト &#8211; Kerosoft : Modus Operandi
				
				要はIPアドレス、ID、パスワードなどをPOSTしてあげれば良いみたい。上のエントリーでは、ShellscriptとPerlで書かれていたので、内容を参考にしつつPythonで書きました。
				
#!/usr/bin/env python
# coding: utf-8

import urllib

def get_ip():
    f = urllib.urlopen('http://dyn.value-domain.com/cgi-bin/dyn.fcg?ip')
    ip = f.read()
    return ip

def regist_host(ip, url):
    userid = 'ACCOUNT'
    passwd = 'PASSWORD'
    keyword = u'SSH登録'
   [...]]]></description>
			<content:encoded><![CDATA[				<p>このBlogをホスティングしているCORESERVERは手頃で良いんだけど、SSH接続する前にWeb上の管理画面で、SSH接続のためホスト情報をサーバーに登録する必要があり、この作業が結構面倒くさい。一回登録すれば３０日は有効なのだけど、その間に別の場所からSSH接続したいときは登録しなおさなければならない。なにか良い方法はないかなと捜していたら自動登録スクリプトを作成している方々がいました。</p>
				<ul>
				<li><a href="http://d.hatena.ne.jp/int128/20090113/1231850343">coreserverのSSH登録を自動化するスクリプト &#8211; Geek Not Found</a></li>
				<li><a href="http://mo.kerosoft.com/0119">xrea(coreserver) SSHホスト登録スクリプト &#8211; Kerosoft : Modus Operandi</a></li>
				</ul>
				<p>要はIPアドレス、ID、パスワードなどをPOSTしてあげれば良いみたい。上のエントリーでは、ShellscriptとPerlで書かれていたので、内容を参考にしつつPythonで書きました。</p>
				<pre class="brush: python;">
#!/usr/bin/env python
# coding: utf-8

import urllib

def get_ip():
    f = urllib.urlopen('http://dyn.value-domain.com/cgi-bin/dyn.fcg?ip')
    ip = f.read()
    return ip

def regist_host(ip, url):
    userid = 'ACCOUNT'
    passwd = 'PASSWORD'
    keyword = u'SSH登録'
    encoding = 'shift-jis'
    p = [
        ('id', userid),
        ('pass', passwd),
        ('remote_host', ip),
        ('ssh2', keyword.encode(encoding)),
    ]

    params = urllib.urlencode(p)
    #print params
    up = urllib.urlopen(url, params)
    #print up.read()

if __name__ == '__main__':
   url = 'https://ss1.coressl.jp/www.sXX.coreserver.jp/jp/admin.cgi'
   ip = get_ip()
   regist_host(ip, url)
</pre>
				<p>一応問題なくホスト登録出来たので大丈夫だとは思いますが、使用する場合は自己責任でお願いします。Pythonのバージョンは2.6で確認取っています。useridとpasswdは各自設定したものを、urlのsXXには自分のサーバ番号を入れて下さい。<br />
				<span id="more-488"></span></p>
				<h3>クエリ文字列を作成するところでハマった点</h3>
				<p>クエリ文字列を作成する箇所（urlencode）を<a href="http://www.python.jp/doc/release/lib/node579.html">Python ライブラリリファレンス</a>を参考にして作っていたのですが、どうも辞書で作るとクエリ文字列の順序が意図したように作れないみたい。</p>
				<pre class="brush: python;">
#!/usr/bin/env python
# coding: utf-8

import urllib

#ディクショナリの場合
query = {
    'id': &quot;userid&quot;,
    'pass': &quot;passwd&quot;,
    'remotehost': &quot;ip&quot;,
}

#タプルの場合
query2 = [
    ('id', &quot;userid&quot;),
    ('pass', &quot;passwd&quot;),
    ('remotehost', &quot;ip&quot;),
]

print urllib.urlencode(query)
print urllib.urlencode(query2)
</pre>
				<p>実行結果</p>
				<pre class="brush: bash;">

% python ~/python/bin/encode.py
remotehost=ip&amp;id=userid&amp;pass=passwd #ディクショナリ
id=userid&amp;pass=passwd&amp;remotehost=ip #タプル
</pre>
				<p>これで小一時間悩みました。</p>
]]></content:encoded>
			<wfw:commentRss>http://aoshiman.net/weblog/2009/09/16/coreserver_ssh/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pythonで１日のGoogle検索履歴の一覧を作成してGmailから送信する</title>
		<link>http://aoshiman.net/weblog/2008/09/30/google_search_history/</link>
		<comments>http://aoshiman.net/weblog/2008/09/30/google_search_history/#comments</comments>
		<pubDate>Tue, 30 Sep 2008 14:21:56 +0000</pubDate>
		<dc:creator>aoshiman</dc:creator>
				<category><![CDATA[Gmail]]></category>
		<category><![CDATA[feedparser]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[smtplib]]></category>
		<category><![CDATA[urllib]]></category>
		<category><![CDATA[RSS]]></category>

		<guid isPermaLink="false">http://aoshiman.net/weblog/?p=17</guid>
		<description><![CDATA[				今の私にとって（他の人もそうだと思いますが）、仕事プライベートに関係なく、Google検索は無くてはならないものですが、はたして１日にどのくらい検索しているのか知りたくて、リストを作成してみました。併せて前回のYahoo!天気情報のRSSと同様にGmailで送信しています。役に立つか分かりませんが、作成したコードを掲載します（スクリプトは何度も実行して成功しているものですが、実施は自己責任でお願いします）。尚、Google検索の履歴（Google Search History）はGoogleアカウントでログインしている状態で有効になります。
				作成した時のポイントとしては
				
				Google Search History は RSS で取得出来るので、feedparserを利用した
				RSS は Basic認証がかかる為、urllibのFancyURLopenerを使用した
				RSSのURLは件数のパラメータ（&#038;num=）が無い場合、25件しか取得出来ないようなので（自分調べ）、１日で必要な件数を設定した
				取得出来る日時がGMTなので、日本時間（＋9h）にする方法に悩んだ
				
				
# coding:utf-8

import urllib
import feedparser
import email.Utils
from time import *

import smtplib
from email.MIMEText import MIMEText
from email.Header import Header
from email.Utils import formatdate

class MyURLopener(urllib.FancyURLopener):
    def prompt_user_passwd(self, host, realm):
        return ('YOUR_GMAIL_ADDRESS', 'YOUR_PASSWORD')

def feed_parse(u):
    f = opener.open(u)
    [...]]]></description>
			<content:encoded><![CDATA[				<p>今の私にとって（他の人もそうだと思いますが）、仕事プライベートに関係なく、Google検索は無くてはならないものですが、はたして１日にどのくらい検索しているのか知りたくて、リストを作成してみました。併せて前回の<a href="http://aoshiman.net/weblog/2008/09/21/yahoo_rss_gmail/">Yahoo!天気情報のRSS</a>と同様にGmailで送信しています。役に立つか分かりませんが、作成したコードを掲載します（スクリプトは何度も実行して成功しているものですが、実施は自己責任でお願いします）。尚、Google検索の履歴（Google Search History）はGoogleアカウントでログインしている状態で有効になります。<br />
				作成した時のポイントとしては<span id="more-17"></span></p>
				<ul>
				<li>Google Search History は RSS で取得出来るので、feedparserを利用した</li>
				<li>RSS は Basic認証がかかる為、urllibのFancyURLopenerを使用した</li>
				<li>RSSのURLは件数のパラメータ（&#038;num=）が無い場合、25件しか取得出来ないようなので（自分調べ）、１日で必要な件数を設定した</li>
				<li>取得出来る日時がGMTなので、日本時間（＋9h）にする方法に悩んだ</li>
				</ul>
				<pre class="brush: python;">
# coding:utf-8

import urllib
import feedparser
import email.Utils
from time import *

import smtplib
from email.MIMEText import MIMEText
from email.Header import Header
from email.Utils import formatdate

class MyURLopener(urllib.FancyURLopener):
    def prompt_user_passwd(self, host, realm):
        return ('YOUR_GMAIL_ADDRESS', 'YOUR_PASSWORD')

def feed_parse(u):
    f = opener.open(u)
    d = feedparser.parse(f)
    TEMPLATE = '* %(entry_date)s : %(entry_title)s'
    feed = []
    for entry in d.entries:
        feed.append([entry.date, entry.title])
    feed.reverse()

    item_list = []
    today = localtime(time())[0:3]
    for i in feed:
        entry_date, entry_title = i[0], i[1]
        entry_date = localtime(mktime(email.Utils.parsedate(entry_date)) + 32400)
        if entry_date[0:3] == today:
            entry_date = strftime('%Y/%m/%d %H:%M:%S',entry_date)
            item_list.append(TEMPLATE % locals())
    items = '\n'.join(item_list)

    return items

def create_message(from_addr, to_addr, subject, body, encoding):
    msg = MIMEText(body.encode(encoding), 'plain', encoding)
    msg['Subject'] = Header(subject, encoding)
    msg['From'] = from_addr
    msg['To'] = to_addr
    msg['Date'] = formatdate()

    return msg

def send_via_gmail(from_addr, to_addr, msg):
    s = smtplib.SMTP('smtp.gmail.com', 587)
    s.ehlo()
    s.starttls()
    s.ehlo()
    s.login('YOUR_GMAIL_ADDRESS', 'YOUR_PASSWORD')
    s.sendmail(from_addr, to_addr, msg.as_string())
    s.close()

if __name__ == '__main__':
    number = '200'
    URL = 'http://www.google.com/searchhistory/?output=rss&amp;amp;amp;num=%s' % number
    opener = MyURLopener({})
    subject = 'Google search history'
    body = feed_parse(URL)
    from_addr = 'YOUR_GMAIL_ADDRESS'
    to_addr = 'xxxxxxxxxxxxx@gmail.com'
    msg = create_message(from_addr, to_addr, subject, body, 'UTF-8')
    send_via_gmail(from_addr, to_addr, msg)
</pre>
				<p>
				実際に送ってみるとこんなかんじです。これは一部分で、調べものが多いときは100件以上／日は検索していました。<br />
				<img src="http://aoshiman.net/weblog/wp-admin/user-images/20080930_01.png" alt="Gmail" /><br />
				<br />
				少しとはいえ、自分の検索を晒すのは恥ずかしい＞＜。Typoとか（笑。<br />
				これを応用すれば、twitterで検索履歴をポストすることも出来そう。とっても恥ずかしいけどね。</p>
				<h3>参考サイト</h3>
				<ul>
				<li><a href="http://d.hatena.ne.jp/mzp/20070616/twitter">みずぴー日記 今日のTwitter</a></li>
				<li><a href="http://itpro.nikkeibp.co.jp/article/COLUMN/20080407/298191/?P=2">第3回 スクレイピングにチャレンジ！</a></li>
				<li><a href="http://labs.unoh.net/2007/06/python_2.html">ウノウラボ Pythonでメールを送信したい人のためのサンプル集 </a></li>
				</ul>
]]></content:encoded>
			<wfw:commentRss>http://aoshiman.net/weblog/2008/09/30/google_search_history/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
