- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
好吧,我想做的是使用 Google 的配置 API 在后台将成员添加到 Google 群组,因为他们在 Google 类(class)构建器(由 Google 应用引擎提供支持)中注册/注册。
我尝试的第一个方法是使用此处显示的 clientLogin 方法:https://developers.google.com/google-apps/provisioning/#adding_a_member_to_a_group
groupClient = gdata.apps.groups.client.GroupsProvisioningClient(domain=domain)
groupClient.ClientLogin(email=email, password=password, source='apps')
groupClient.AddMemberToGroup(group_id, member_id)
尽管这在 App Engine 之外有效,但在实现后我遇到了一些错误并被告知 (http://stackoverflow.com/questions/13867535/python-import-gdata-google-apps-engine-course-builder )在 App Engine 中使用它是一个坏主意,因为它已被弃用。
我现在尝试使用此处找到的 python 配置 oAuth 示例 (https://developers.google.com/google-apps/help/libraries-samples#provisioningv2) 来完成此任务
来源如下:
"""Sample for the Provisioning API and the Email Settings API with OAuth 2.0."""
__author__ = 'Shraddha Gupta <shraddhag@google.com>'
from optparse import OptionParser
import gdata.apps
import gdata.apps.emailsettings.client
import gdata.apps.groups.client
import gdata.client
import gdata.gauth
import httplib
API_VERSION = '2.0'
BASE_URL = '/a/feeds/group/%s' % API_VERSION
SCOPE = ('https://apps-apis.google.com/a/feeds/groups/')
HOST = 'apps-apis.google.com'
class OAuth2ClientSample(object):
"""OAuth2ClientSample object demos the use of OAuth2Token for retrieving
Members of a Group and updating Email Settings for them."""
def __init__(self, domain, client_id, client_secret):
"""
Args:
domain: string Domain name (e.g. domain.com)
client_id: string Client_id of domain admin account.
client_secret: string Client_secret of domain admin account.
"""
try:
self.token = gdata.gauth.OAuth2Token(client_id=client_id,
client_secret=client_secret,
scope=SCOPE,
user_agent='oauth2-provisioningv2')
self.uri = self.token.generate_authorize_url()
#print 'Please visit this URL to authorize the application:'
#print self.uri
# Get the verification code from the standard input.
#code = raw_input('What is the verification code? ').strip()
conn = httplib.HTTPConnection(self.uri)
conn.request("GET")
r1 = conn.getresponse()
print r1.read()
self.token.get_access_token(code)
except gdata.gauth.OAuth2AccessTokenError, e:
print 'Invalid Access token, Check your credentials %s' % e
exit(0)
self.domain = domain
self.baseuri = '%s/%s' % (BASE_URL, domain)
self.client = gdata.apps.groups.client.GroupsProvisioningClient(
domain=self.domain, auth_token=self.token)
# Authorize the client.
# This will add the Authorization header to all future requests.
self.token.authorize(self.client)
self.email_client = gdata.apps.emailsettings.client.EmailSettingsClient(
domain=self.domain, auth_token=self.token)
self.token.authorize(self.email_client)
def create_filter(self, feed):
"""Creates a mail filter that marks as read all messages not containing
Domain name as one of their words for each member of the group.
Args:
feed: GroupMemberFeed members whose emailsettings need to updated
"""
for entry in feed.entry:
user_name, domain = entry.member_id.split('@', 1)
if entry.member_type == 'User' and domain == self.domain:
print 'creating filter for %s' % entry.member_id
self.email_client.CreateFilter(user_name,
does_not_have_the_word=self.domain,
mark_as_read=True)
elif entry.member_type == 'User':
print 'User belongs to other Domain %s' %entry.member_id
else:
print 'Member is a group %s' %entry.member_id
def run(self, group):
feed = self.client.RetrieveAllMembers(group)
self.create_filter(feed)
def main():
sample = OAuth2ClientSample('mydomain.mygbiz.com',
'mydomain', 'My client secret')
sample.run('test')
if __name__ == '__main__':
main()
我意识到这只是列出我的组的成员,但现在我只是想通过身份验证阶段。
我具体提到的代码是:
#print 'Please visit this URL to authorize the application:'
#print self.uri
# Get the verification code from the standard input.
#code = raw_input('What is the verification code? ').strip()
conn = httplib.HTTPConnection(self.uri)
conn.request("GET")
r1 = conn.getresponse()
print r1.read()
self.token.get_access_token(code)
我注释掉了原始代码,该代码采用 token 的原始输入。这需要在后台无缝运行,因此我需要它自动检索 token 。我已启动 httplib,但它返回了 URL 错误。
我有几个问题。
首先,这是我需要做的最简单的方法吗,这似乎有点矫枉过正。 clientLogin 更加优雅和简单。
第二,如果我必须这样做,那么一旦获得验证 URL,我该如何检索 token ?我使用 httplib 吗?
我认真考虑在 Python 中模拟浏览器......为什么这个过程如此复杂?
我们非常感谢您提供的任何帮助。
编辑:我只是想指出,首先执行所有这些操作的原因是为了开发 MOOC类(class) build 者可能拥有数万到数十万的成员(member)。讨论平台将是Google群组,但我们不能向公众开放,但我们也无法手动批准每个成员。
最佳答案
您可以继续使用 ClientLogin,弃用过程很慢 (https://developers.google.com/accounts/terms)。我的应用程序使用 Oauth 2,但不使用应用程序引擎。您可以从项目的 API 控制台页面 (https://code.google.com/apis/console) 下载 client_secrets.json 文件,并从该文件中检索 secret 等。例如:
import oauth2client.client
import oauth2client.file
import oauth2client.tools
...
oauth2_flow = oauth2client.client.flow_from_clientsecrets('client_secrets.json',
scope='list of scopes',message='Missing client_secrets.json file message')
storage = oauth2client.file.Storage('creedentials.ouath2')
oauth2_credentials = storage.get()
if oauth2_credentials is None or oauth2_credentials.invalid:
oauth2_credentials = oauth2client.tools.run(oauth2_flow, storage)
...
关于python - 使用 Python 在 Google App Engine 中提供 Google 配置 API 和 oAuth2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13870185/
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!