收集、存储并显示来自Foursquare、iCloud等平台的实时位置信息。
项目描述
django-location
你在Foursquare上签到吗?你用Runmeter跟踪跑步或骑自行车通勤吗?你使用iOS设备吗?为什么让第三方接口成为你日常活动的唯一窗口呢?
这个Django应用程序将消费Foursquare、iCloud和Runmeter(如果你是它的用户)提供的位置信息,并将其存储在数据库中以供随意显示。
安装
你可以通过pip安装
pip install django-location
或者 从github仓库检出并安装源代码
git clone https://github.com/latestrevision/django-location.git cd django-location python setup.py install
你需要在项目的urls.py中添加django-social-auth和django-location;技术上你可以使用任何URL,但为了下面的说明,我们将期望你添加如下
url(r'^location/', include('location.urls')), url(r'', include('social_auth.urls')),
推荐额外包
如果安装了以下两个包,每个收集到的点也能提供它所在的社区和城市信息
位置来源
对于以下一些消费者,特别是iCloud和Runmeter,你需要设置一个cron作业来处理某些周期性任务,你可以通过添加运行以下cron作业来实现
python /path/to/your/manage.py location_consumer
我建议每五或十分钟运行一次,但选择更长的间隔只会产生轻微的影响;要么减少样本频率(在iCloud消费者的情况下),要么增加更新延迟(在Runmeter消费者的情况下)。
Foursquare
Foursquare 在其消费设置中提供了选项,可以将其签到信息即时发布到该应用程序提供的API端点。为了支持这一点,您需要执行以下操作:
访问 Foursquare 开发者网站 并创建一个新的消费者。
输入 django-social-auth 的 Foursquare 后端回调 URL(通常为 http://yourdomain.com/complete/foursquare/)。
开启推送 API 通知(“通过此消费者的用户推送签到”)。
输入 django-location 应用程序的推送 URL(通常为 https://yourdomain.com/location/foursquare/)。注意:Foursquare 要求通过 HTTPs 建立连接。
配置以下设置:
FOURSQUARE_CONSUMER_KEY = "THECLIENTIDYOUJUSTGENERATED" FOURSQUARE_CONSUMER_SECRET = "THECLIENTSECRETYOUJUSTGENERATED"
登录到管理员,访问 django-location 应用的配置 URL(通常为 http://yourdomain.com/admin/location/locationsource/configure-accounts/),然后单击“授权 Foursquare”按钮。这将带您进入 Foursquare 网站,并使用您配置的选项授权您的网络应用程序接收从 Foursquare 登录的用户发送的签到。
如果一切设置正确,您可能不需要做任何事情,但 Foursquare 在其消费者控制台中提供“发送测试推送”按钮,您可以使用它来验证一切是否连接正确。
Runmeter
Runmeter 不提供 API,但允许您配置应用程序在您开始(和结束等)跑步、骑自行车或任何其他活动时发送电子邮件通知。要从 Runmeter 消费信息,我们将配置它将电子邮件发送到另一个未使用的电子邮件收件箱(重要),并配置 django-location 消费这些电子邮件消息并从链接的 KML 文件中提取坐标。
配置 Runmeter 应用程序以将开始和完成通知发送到可通过 POP3 或 IMAP 访问的邮箱。
设置 Django Mailbox 以从此类邮箱中消费邮件(请参阅 django-mailbox 的文档)。
更新用户的“位置消费者设置”记录,将字段 runmeter_email 设置为用户设备将发送 Runmeter 更新的电子邮件地址。
iCloud
iCloud 提供了一个名为“查找我的 iPhone”的服务,允许您随时请求您的设备位置。这个库为您提供了一种简单的方法,可以将此服务的位置信息作为您的一个位置来源。
通过使用 list_icloud_devices 管理命令识别与您的账户关联的设备
python /path/to/your/manage.py list_icloud_devices <icloud username> <icloud password>
将 <icloud username> 和 <icloud password> 替换为您的 iCloud 用户名和密码。
这将打印设备及其 ID 的列表;在我的情况下,它打印的内容如下
Name: MacBook Air 11": sinclair -- ID: reGYDh9XwqNWTGIhNBuEwP1ds0F/Lg5t/fxNbZ3V939hhXawByErk+HYVNSUzmWV Name: iPhone 4S: Adam Coddingtons iPhone -- ID: i9vbKRGIcLYqJnXMc1b257kUWnoyEBcEh6yM+IfmiMLh7BmOpALU+w==
更新用户的“位置消费者设置”记录,包括用户希望收集位置信息的 iCloud 用户名、iCloud 密码 和 iCloud 设备 ID。
使用模板标签显示位置
您可以使用 current_location 模板标签来获取给定用户的最新位置。
简单示例
{% load current_location %} {% current_location of 'adam' as location_of_adam %} <p> {{ location_of_adam.user.username }} is at {{ location_of_adam.location.coords.1 }}, {{ location_of_adam.location.coords.0 }} </p>
如果您已安装“django-neighborhoods”和“django-census-places”,您还可以打印城市和社区信息
{% load current_location %} {% current_location of 'adam' as location_of_adam %} <p> {{ location_of_adam.user.username }} is in the {{ location_of_adam.neighborhood.name }} neighborhood of {{ location_of_adam.city.name }}, {{ location_of_adam.city.get_state_display }}. </p>
对于给定的点,您可能没有社区或城市信息,并且可能希望使用 Google Maps API 显示地图;以下是一个完整的示例
{% load current_location %} <script src="http://maps.google.com/maps/api/js?sensor=true" type="text/javascript"></script> {% current_location of 'somebody' as location %} {{ location.user.username }} is {% if location.neighborhood %} in the {{ location.neighborhood.name }} neighborhood of {{ location.neighborhood.city }}, {{ location.neighborhood.state }}: {% elif location.city %} in {{ location.city.name }}, {{ location.city.get_state_display }}: {% else %} ({{ location.get_nearest_city.distance.mi }} miles from {{ location.get_nearest_city.name }}): {% endif %} <div id="my_location_map" style="width: 100%; height: 400px;"></div> <script type="text/javascript"> var myLocation = document.getElementById('my_location_map'); myLocation.gmap({ 'center': '{{ location.location.coords.1 }},{{ location.location.coords.0 }}', 'zoom': 10, 'mapTypeId': google.maps.MapTypeId.HYBRID }); myLocation.gmap('addMarker', { 'position': '{{ location.location.coords.1 }},{{ location.location.coords.0 }}', }); </script>