Created
December 31, 2011 22:36
-
-
Save mohayonao/1545546 to your computer and use it in GitHub Desktop.
MixiProileImage
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# -*- coding: utf-8 -*- | |
import re | |
import mechanize | |
class MixiProfileImage: | |
MIXI_URL = "http://mixi.jp/" | |
LOGIN_FORM_NAME = "login_form" | |
PROFILE_IMAGE_URL = "http://mixi.jp/list_self_profile_image.pl" | |
RPC_URL = "/system/rpc.json?auth_type=postkey&secret=%s" | |
def __init__(self, email, password): | |
self.email = email | |
self.password = password | |
self.client = mechanize.Browser() | |
self.client.open(MixiProfileImage.MIXI_URL) | |
self.client.select_form(name=MixiProfileImage.LOGIN_FORM_NAME) | |
self.client["email" ] = email | |
self.client["password"] = password | |
self.client.submit() | |
self._open_profile_image_page() | |
def _open_profile_image_page(self, source=None): | |
r = re.compile('="¥?id=([0-9a-f]+)&level=([12])&is_main=([ny])"') | |
if source is None: | |
self.client.open(MixiProfileImage.PROFILE_IMAGE_URL) | |
source = self.client.response().read() | |
m = re.search(r'"rpc_post_key":"([0-9a-f]+)"', source) | |
self.postkey = m.group(1) if m else None | |
result, pos = {}, 0 | |
while True: | |
m = r.search(source, pos) | |
if not m: break | |
result[m.group(1)] = {"id":m.group(1), "level":m.group(2), "is_main":m.group(3)} | |
pos = m.end(3) | |
self.images = result | |
def add(self, path, level="2", is_main="n"): | |
"""プロフィール画像を追加する""" | |
self._open_profile_image_page() | |
saved = set(self.images.keys()) | |
self.client.select_form(nr=0) | |
self.client["level"] = [level] | |
self.client.add_file(open(path), "image/jpeg", path) | |
self.client.set_all_readonly(False) | |
self.client.submit() | |
self._open_profile_image_page(self.client.response().read()) | |
image_id = list(set(self.images.keys()) - saved) | |
if image_id: | |
image = self.images[image_id[0]] | |
if is_main == "y" and image["is_main"] == "n": | |
self.update(image, level=image["level"], is_main="y") | |
else: | |
image = None | |
return image | |
def update(self, image, level="2", is_main="n"): | |
"""プロフィール画像を変更する""" | |
url = MixiProfileImage.RPC_URL % self.postkey | |
params = '{"jsonrpc": "2.0", "method": "jp.mixi.profileimage.updateEntry", "params": {"image_name": "%s", "level": "%s", "is_main": "%s", "device":1 }, "id": 0}' % (image["id"], level, is_main) | |
self.client.open(url, params) | |
self._open_profile_image_page() | |
def delete(self, image): | |
"""プロフィール画像を削除する""" | |
url = MixiProfileImage.RPC_URL % self.postkey | |
params = '{"jsonrpc": "2.0", "method": "jp.mixi.profileimage.deleteEntry", "params": {"image_name": "%s"}, "id": 0}' % image["id"] | |
self.client.open(url, params) | |
self._open_profile_image_page() | |
def filter(self, level=None, is_main=None): | |
"""プロフィール画像を絞り込む""" | |
result = {} | |
for k, v in self.images.iteritems(): | |
if level is not None: | |
if v["level"] != level: continue | |
if is_main is not None: | |
if v["is_main"] != is_main: continue | |
result[k] = v | |
return result |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment