用于与okcupid.com交互的包
项目描述
入门
安装/设置
pip/PyPI
okcupyd可以从PyPI安装。如果您有pip,可以简单地运行
pip install okcupyd
以使okcupyd可用于Python导入。
从源代码
您可以通过运行作为此存储库一部分的setup.py脚本从源代码进行安装,如下所示
python setup.py install
如果您想安装尚未在PyPI上发布的版本,这可能很有用。
从Docker
okcupyd在Docker上可用(见 https://registry.hub.docker.com/u/imalison/okcupyd/)
如果您在机器上安装了Docker,您可以运行
docker run -t -i imalison/okcupyd okcupyd
以获取交互式okcupyd shell。
使用
交互式
安装okcupyd包应在您的$PATH中的一个目录中添加一个可执行脚本,这将允许您在选择的shell中输入okcupyd以进入一个为使用okcupyd而准备的交互式ipython shell。在shell开始之前,您将提示输入用户名和密码。此可执行脚本接受–enable-logger标志,它启用具有给定名称的记录器,以及–credentials标志,其操作如下所示。
如果您遇到任何问题,强烈建议您使用–enable-logger=requests和–enable-logger=okcupyd标志。
凭证
如果您希望每次启动新会话时都避免输入密码,您可以执行以下操作之一
创建一个Python模块(.py文件),将您的用户名和密码分别设置为变量USERNAME和PASSWORD。您可以通过运行以下命令来使用存储在my_credentials.py中的USERNAME和PASSWORD启动交互式会话:
PYTHONPATH=. okcupyd --credentials my_credentials
从存储my_credentials.py的目录运行
命令开头的PYTHONPATH=.是必要的,以确保当前目录被搜索以查找模块。
如果您想使用已克隆但未安装的库版本,可以使用tox环境venv以相同的代码版本执行相同操作。
PYTHONPATH=. tox -e venv -- okcupyd --credentials my_credentials
将shell环境变量OKC_USERNAME和OKC_PASSWORD分别设置为您的用户名和密码。确保导出变量,以便在从shell启动的进程中可见。您可以使用以下模板创建一个credentials.sh文件来完成此操作:
export OKC_USERNAME='your_username'
export OKC_PASSWORD='your_password'
只需运行source credentials.sh即可设置环境变量,并且您的shell应正确配置。请注意,此方法要求在导入okcupyd.settings之前设置相关环境变量。
3. 手动覆盖okcupyd/settings.py中的值。不建议使用此方法,因为它需要您找到包的安装位置。此外,如果您正在使用源代码控制的版本,您可能会意外提交您的凭据。
在自定义脚本中使用--credentials
可以使用~okcupyd.util.misc.add_command_line_options和~okcupyd.util.misc.handle_command_line_options在自定义脚本中支持--credentials和--enable-loggers命令行标志。这些函数的接口确实有点奇怪。有关如何使用它们的详细信息,请参阅下面的示例。
import argparse
parser = argparse.ArgumentParser()
util.add_command_line_options(parser.add_argument)
args = parser.parse_args()
util.handle_command_line_options(args)
基本示例
本节中的所有示例都假设变量u已按以下方式初始化
import okcupyd
user = okcupyd.User()
搜索资料
通过用户进行搜索
profiles = user.search(age_min=26, age_max=32)
for profile in profiles[:10]:
profile.message("Pumpkins are just okay.")
搜索回答特定问题的用户,其回答方式与用户对该问题的偏好一致
user_question = user.questions.very_important[0]
profiles = user.search(question=user_question)
for profile in profiles[:10]:
their_question = profile.find_question(user_question.id)
profile.message("I'm really glad that you answered {0} to {1}".format(
their_question.their_answer, their_question.question.text
))
搜索功能可以在没有~okcupyd.user.User实例的情况下访问
from okcupyd.search import SearchFetchable
for profile in SearchFetchable(attractiveness_min=8000)[:5]:
profile.message("hawt...")
如果您想明确提供应使用的会话进行搜索,这尤其有用
from okcupyd.session import Session
from okcupyd.search import SearchFetchable
session = Session.login('username', 'password')
for profile in SearchFetchable(session=session, attractiveness_min=8000)[:5]:
profile.message("hawt...")
有关这些搜索函数可使用哪些过滤参数的更多详细信息,请参阅~okcupyd.search.SearchFetchable的文档。
给其他用户发消息
user.message('foxylady899', 'Do you have a map?')
# This has slightly different semantics; it will not look through the user's
# inbox for an existing thread.
user.get_profile('foxylady889').message('Do you have a map?')
评价资料
user.get_profile('foxylady899').rate(5)
邮箱
first_thread = user.inbox[0]
print(first_thread.messages)
快速匹配、文章、寻找、详细信息
您可以非常容易地访问资料的论文、寻找属性和详细属性
profile = user.quickmatch()
print(profile.essays.self_summary)
print(profile.looking_for.ages)
print(profile.details.orientation)
这些属性的数据是从资料页面加载的,但应注意,此页面仅在需要时加载,因此这些属性访问的第一个调用将发起http请求。
登录用户可以使用这些对象更新自己的详细信息
user.profile.essays.self_summary = "I'm pretty boring."
user.profile.looking_for.ages = 18, 19
user.profile.details.ethnicities = ['asian', 'black', 'hispanic']
这些赋值将导致okcupid网站的更新。当这些更新发生时,对任何资料属性的后续访问将导致新的http请求以重新加载资料页面。
可检索的
从okcupyd库中的函数调用返回的大多数集合对象都是~okcupyd.util.fetchable.Fetchable的实例。在大多数情况下,可以将这些对象视为列表,因为它们可以迭代、切片和按索引访问,就像列表一样
for question in user.profile.questions:
print(question.answer.text)
a_random_question = user.profile.questions[2]
for question in questions[2:4]:
print(question.answer_options[0])
但是,在某些情况下,了解~okcupyd.util.fetchable.Fetchable对象和Python列表之间的微妙差异很重要。~okcupyd.util.fetchable.Fetchable会延迟构建它们“包含”的元素。在okcupyd库的大部分使用中,这意味着可以发起http请求以填充~okcupyd.util.fetchable.Fetchable实例的元素,就像它们被请求时一样。
上面示例中使用的 ~okcupyd.profile.Profile.questions ~okcupyd.util.fetchable.Fetchable 在批量为10个问题的情况下获取用于构建其内容的页面。这意味着实际的数据检索调用是在迭代开始时进行的。如果您在运行此代码片段时启用请求记录器,您将得到输出,说明这一事实。
{.sourceCode .} 2014-10-29 04:25:04 Livien-MacbookAir requests.packages.urllib3.connectionpool[82461] DEBUG "GET /profile/ShrewdDrew/questions?leanmode=1&low=11 HTTP/1.1" 200 None Yes Yes 性别。是的。是。性别。两者都一样。不,我不会把它作为礼物。也许,我想知道所有重要的事情。一周一次或两次 2014-10-29 04:25:04 Livien-MacbookAir requests.packages.urllib3.connectionpool[82461] DEBUG "GET /profile/ShrewdDrew/questions?leanmode=1&low=21 HTTP/1.1" 200 None No. No No 是的。很少/从不。总是。发现你的共同兴趣。太阳。可以接受。不。
某些可取用项将长时间持续获取内容。例如,搜索可取用项将一直获取内容,直到Okcupid搜索结果耗尽。因此,应避免以下操作,因为它们可能会生成大量对okcupid.com的请求。
for profile in user.search():
profile.message("hey!")
,因为它们很可能会生成大量的okcupid.com请求。
~okcupyd.util.fetchable.Fetchable类的另一个微妙之处在于,它的实例缓存其包含的结果。这意味着下面示例中的第二个迭代~okcupyd.profile.Profile.questions不会导致任何HTTP请求。
for question in user.profile.questions:
print(question.text)
for question in user.profile.questions:
print(question.answer)
重要的是要理解这意味着~okcupyd.util.fetchable.Fetchable的内容在第二次请求时不一定与okcupid.com同步。调用~okcupyd.util.fetchable.Fetchable.refresh将导致~okcupyd.util.fetchable.Fetchable在请求其内容时从okcupid.com请求新数据。以下代码片段将打印出登录用户大约每小时回答一次的所有问题,包括在程序运行期间回答的问题。
import time
while True:
for question in user.profile.questions:
print(question.text)
user.profile.questions.refresh()
time.sleep(3600)
如果没有调用user.profile.questions.refresh(),则此程序永远不会更新user.profile.questions实例,因此每次迭代循环都会打印到屏幕上。
开发
tox
如果您希望为此项目做出贡献,建议您使用tox来运行测试并进入交互式环境。您可以通过运行以下命令来获取tox
pip install tox
如果您还没有的话。
一旦您已克隆该项目并安装了tox,请运行
tox -e py27
这将创建一个虚拟环境,其中包含所有依赖项以及有用的ipython和ipdb库,并运行所有okcupyds测试套件。
如果您想使用由tox创建的虚拟环境中的命令,可以运行
tox -e venv -- your_command
要使用交互式外壳的开发版本(并避免与site-packages中安装的版本发生冲突)您将运行以下命令
tox -e venv -- okcupyd
git hooks
如果您打算编辑此文件(getting_started.rst),您必须通过运行以下命令安装此存储库中提供的git hooks
bin/create-githook-symlinks.sh
从存储库的根目录。
项目详情
okcupyd-0.9.0.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 1885b88913700e69b6dd2a8a5d7f26529116c3d34d72dec03637a6afec56ea4b |
|
MD5 | e6835584a444705ec91910b5f0f8f96d |
|
BLAKE2b-256 | 0af05b09adf66dd5e000b39914134fda41fc1c32d57535e27d12113d913346be |