Skip to content

Instantly share code, notes, and snippets.

@mohayonao
Created December 31, 2011 22:36
Show Gist options
  • Save mohayonao/1545546 to your computer and use it in GitHub Desktop.
Save mohayonao/1545546 to your computer and use it in GitHub Desktop.
MixiProileImage
#!/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