Office365-rest-python-client: Python 3μ—μ„œλŠ” μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2017λ…„ 07μ›” 04일  Β·  24μ½”λ©˜νŠΈ  Β·  좜처: vgrem/Office365-REST-Python-Client

파이썬 3에 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆκΉŒ?

bug enhancement

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

@vic-by 졜근 μ»€λ°‹μœΌλ‘œ λ¬Έμ œκ°€ ν•΄κ²°λ˜μ—ˆμŠ΅λ‹ˆλ‹€. https://github.com/vgrem/Office365-REST-Python-Client/commit/90731f
ν˜„μž¬ 이 컀밋은 아직 pypi에 ν‘Έμ‹œλ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ pip install Office365-REST-Python-Client λ₯Ό μˆ˜ν–‰ν•˜λ©΄ ν•΄λ‹Ή μ½”λ“œλ₯Ό 얻을 수 μ—†μŠ΅λ‹ˆλ‹€. gitμ—μ„œ μ„€μΉ˜: pip install git+https://github.com/vgrem/Office365-REST-Python-Client.git

λͺ¨λ“  24 λŒ“κΈ€

μ•ˆλ…•ν•˜μ‹­λ‹ˆκΉŒ,

Python 2 및 3의 두 버전 λͺ¨λ‘μ™€ ν˜Έν™˜λ˜μ–΄μ•Ό ν•˜μ§€λ§Œ ν™•μΈν•˜κ² μŠ΅λ‹ˆλ‹€. λ‹Ήμ‹ μ—κ²Œ λŒμ•„μ˜¬ κ²ƒμž…λ‹ˆλ‹€.

μ•ˆλ…•ν•˜μ„Έμš” μ‹ μ†ν•œ λ‹΅λ³€ κ°μ‚¬ν•©λ‹ˆλ‹€.
μ•„λž˜λŠ” λ‚΄κ°€ μ–»λŠ” 였λ₯˜μž…λ‹ˆλ‹€
`---------------------------------------------------- --------------------------
ModuleNotFoundError 좔적(κ°€μž₯ 졜근 호좜 λ§ˆμ§€λ§‰)
~에()
1 κ°€μ Έμ˜€κΈ° json
2
----> office365.runtime.auth.authentication_contextμ—μ„œ 3 κ°€μ Έμ˜€κΈ° AuthenticationContext
4 office365.runtime.client_request κ°€μ Έμ˜€κΈ° ClientRequestμ—μ„œ
5μ—μ„œ office365.runtime.utilities.request_options κ°€μ Έμ˜€κΈ° RequestOptions

ModuleNotFoundError: 'office365'λΌλŠ” λͺ¨λ“ˆμ΄ μ—†μŠ΅λ‹ˆλ‹€.

그리고 예, pip install λͺ¨λ“ˆμ΄ μžˆμŠ΅λ‹ˆλ‹€. :)

μ•ˆλ…•ν•˜μ„Έμš”, Requests λͺ¨λ“ˆλ§Œμ„ μ‚¬μš©ν•˜μ—¬ 정보λ₯Ό μ–»λŠ” μ½”λ“œλ₯Ό μž‘μ„±ν–ˆμŠ΅λ‹ˆλ‹€. FedAuth 및 rtFa μΏ ν‚€λ₯Ό μ„±κ³΅μ μœΌλ‘œ κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ siteUsersλ₯Ό μ–»μœΌλ €κ³  ν•  λ•Œ Forbidden 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.
이것 μ’€ λ„μ™€μ£Όμ‹œκ² μ–΄μš”?
`κ°€μ Έμ˜€κΈ° μš”μ²­

url=" https://login.microsoftonline.com/extSTS.srf "
헀더 = {'μ½˜ν…μΈ  μœ ν˜•': 'μ‘μš© ν”„λ‘œκ·Έλž¨/json'}
TopLevelUrl=' https://XXXX.sharepoint.com '
경둜='C:\PSR\PythonFiles\SharePointOnlineXML.txt'

파일 λ‚΄μš© = μ—΄κΈ°(경둜, 'r')
SharepointOnlineAuth = filecontent.read()
SharepointOnlineAuth=SharepointOnlineAuth.format('[email protected]','λΉ„λ°€λ²ˆν˜Έ',TopLevelUrl)

μΏ ν‚€λ₯Ό μ–»κΈ° μœ„ν•΄ 토큰을 μ–»κΈ° μœ„ν•΄ μ „ν™”λ₯Ό 걸자

응닡=requests.post(url,data=SharepointOnlineAuth,headers=headers)
s=str(응닡.λ‚΄μš©)
μ‹œμž‘ = [λ²”μœ„(len(s)의 pos에 λŒ€ν•œ pos) if s[pos:].startswith('')][0]
Finish= [pos for pos in range(len(s)) if s[pos:].startswith('
')][0]
LoginResponse=s[μ‹œμž‘+40:마침]

이제 μΏ ν‚€λ₯Ό 가져와 SharePoint Online에 μ „ν™”λ₯Ό κ±Έ 수 μžˆμŠ΅λ‹ˆλ‹€.

url=TopLevelUrl+'/_forms/default.aspx?wa=wsignin1.0'
헀더 = {'μ½˜ν…μΈ  μœ ν˜•': 'μ‘μš© ν”„λ‘œκ·Έλž¨/x-www-form-urlencoded'}
response=requests.post(url,data=LoginResponse,headers=headers)

μœ„μ˜ ν˜ΈμΆœμ—μ„œ 얻은 μΏ ν‚€λ₯Ό μ‚¬μš©ν•˜μ—¬ Sharepoint REST API 호좜

url=TopLevelUrl+'/_api/web/siteusers'
인쇄(URL)
_Fedauth='FedAuth={}'.format(response.cookies['FedAuth'])
_rtFa='rtFa={}'.format(response.cookies['rtFa'])
_FinalDict={'μΏ ν‚€':_Fedauth+','+_rtFa}

헀더 = {'μ½˜ν…μΈ  μœ ν˜•': 'μ‘μš© ν”„λ‘œκ·Έλž¨/x-www-form-urlencoded',
'User-Agent':'Mozilla/5.0(Windows NT 10.0, Win64, x64) AppleWebKit/537.36(KHTML, Gecko λ“±) Chrome/59.0.3071.115 Safari/537.36'}
headers.update(_FinalDict)

인쇄(헀더)

응닡=requests.get(URL, 헀더=헀더)
인쇄(응닡)`

python3.4μ—μ„œ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

_Traceback(κ°€μž₯ 졜근 호좜 λ§ˆμ§€λ§‰):
파일 "auth_sharepoint_online365.py", 2ν–‰,
office365.runtime.auth.authentication_context κ°€μ Έμ˜€κΈ°μ—μ„œ AuthenticationContext κ°€μ Έμ˜€κΈ°
파일 "authentication_context.py", 2ν–‰,
office365.runtime.auth.saml_token_provider κ°€μ Έμ˜€κΈ° SamlTokenProviderμ—μ„œ
파일 "saml_token_provider.py", 라인 2,
urlparse κ°€μ Έμ˜€κΈ°
ImportError: ' urlparse '_λΌλŠ” λͺ¨λ“ˆμ΄ μ—†μŠ΅λ‹ˆλ‹€.

https://docs.python.org/2/library/urlparse.html 에 λ”°λ₯΄λ©΄ :

urlparse λͺ¨λ“ˆμ€ Python 3μ—μ„œ urllib.parse둜 이름이 λ³€κ²½λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

이 https://github.com/parthrawal/Python.O365λ₯Ό μ‹œλ„ν•˜μ‹­μ‹œμ˜€. SharePoint Online에 μ—°κ²°ν•  수 μžˆλŠ” .py νŒŒμΌμ„ μž‘μ„±ν–ˆμœΌλ©° 사전 ν˜•μ‹μ˜ λͺ©λ‘μ—μ„œ 데이터λ₯Ό κ°€μ Έμ˜€λŠ” λͺ‡ 가지 방법도 μžˆμŠ΅λ‹ˆλ‹€. 도움이 ν•„μš”ν•˜λ©΄ μ•Œλ €μ£Όμ‹­μ‹œμ˜€.

@vic-by 졜근 μ»€λ°‹μœΌλ‘œ λ¬Έμ œκ°€ ν•΄κ²°λ˜μ—ˆμŠ΅λ‹ˆλ‹€. https://github.com/vgrem/Office365-REST-Python-Client/commit/90731f
ν˜„μž¬ 이 컀밋은 아직 pypi에 ν‘Έμ‹œλ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ pip install Office365-REST-Python-Client λ₯Ό μˆ˜ν–‰ν•˜λ©΄ ν•΄λ‹Ή μ½”λ“œλ₯Ό 얻을 수 μ—†μŠ΅λ‹ˆλ‹€. gitμ—μ„œ μ„€μΉ˜: pip install git+https://github.com/vgrem/Office365-REST-Python-Client.git

python 3μ—μ„œ 라이브러리λ₯Ό μ‹€μ œλ‘œ μ‚¬μš©ν•˜λ €λ©΄ 아직 μž‘μ—…μ΄ ν•„μš”ν•©λ‹ˆλ‹€.

python 3μ—μ„œ 라이브러리λ₯Ό μ‹€ν–‰ν•  λ•Œ 인코딩 λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. list.propertiesλ₯Ό μˆ˜ν–‰ν•  λ•Œ λ°œμƒν–ˆμ§€λ§Œ λ¬Έμ œκ°€ 지속적이라고 ν™•μ‹ ν•©λ‹ˆλ‹€.

    ctx = ClientContext(url, ctx_auth)
    web = ctx.web
    ctx.load(web)
    ctx.execute_query()
    lists = web.lists
    ctx.load(lists)
    ctx.execute_query()
    lists[0].properties
 in <module>()
---> 16         lists[0].properties

c:\python\python35\lib\encodings\cp850.py in encode(self, input, final)
     17 class IncrementalEncoder(codecs.IncrementalEncoder):
     18     def encode(self, input, final=False):
---> 19         return codecs.charmap_encode(input,self.errors,encoding_map)[0]
     20
     21 class IncrementalDecoder(codecs.IncrementalDecoder):

UnicodeEncodeError: 'charmap' codec can't encode character '\u2019' in position 11052: character maps to <undefined>

Python 3μ—μ„œ λ™μΌν•œ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. "ModuleNotFoundError: 'urlparse'λΌλŠ” λͺ¨λ“ˆμ΄ μ—†μŠ΅λ‹ˆλ‹€."
SharePointOnline.py 파일 ν…ŒμŠ€νŠΈ: 인증 μ‹€νŒ¨ -> μž…λ ₯ν•˜κ³  μ €μž₯된 λΉ„λ°€λ²ˆν˜Έκ°€ μΌμΉ˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

이 링크λ₯Ό μ‹œλ„ ν–ˆμŠ΅λ‹ˆκΉŒ https://github.com/parthrawal/Python.O365 λ™μΌν•œ μ„œλΉ„μŠ€ 계정을 μ‚¬μš©ν•˜λŠ”μ§€ ν™•μΈν•˜μ‹­μ‹œμ˜€

예. ν•˜λ‹¨μ— μ½”λ“œ 볡사/λΆ™μ—¬λ„£κΈ°:

if __name__ == "__main__":
    UserName = "[email protected]"
    # UserName = "[email protected]"
    Password = "my_password"
    TopLevelUrl = "https://company.sharepoint.com/"
    SPOnlineHeaders(UserName, Password, TopLevelUrl)

λ‹€μŒ 였λ₯˜κ°€ λ°˜ν™˜λ©λ‹ˆλ‹€.

....
IndexError: list index out of range

였λ₯˜μ— λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ„ ν™•μΈν•˜κΈ° μœ„ν•΄ SPOnlineHeaders에 λ‹€μŒ μ½”λ“œ(print(s))λ₯Ό μ‚½μž…ν–ˆμŠ΅λ‹ˆλ‹€.

response = requests.post(url, data=SharepointOnlineAuth, headers=headers)
s = str(response.content)
print(s)

응닡:
... wst:FailedAuthentication... μž…λ ₯ν•˜κ³  μ €μž₯된 λΉ„λ°€λ²ˆν˜Έκ°€ μΌμΉ˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€...

λ‚˜λŠ” 당신이 그것을 μ‚¬μš©ν•˜λŠ” 것이 μ„œλΉ„μŠ€ 계정이기λ₯Ό λ°”λžλ‹ˆλ‹€

λ§žμ•„μš”. μ„œλΉ„μŠ€ 계정을 μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

λΉ„λ°€λ²ˆν˜Έκ°€ λ§žμŠ΅λ‹ˆκΉŒ? λ‹€μ‹œ 확인해 μ£Όμ‹œκ² μŠ΅λ‹ˆκΉŒ? μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ €κ³  ν–ˆκΈ° λ•Œλ¬Έμ— μ œλŒ€λ‘œ μž‘λ™ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 잘λͺ»λœ μ•”ν˜Έλ₯Ό μž…λ ₯ν•˜λ©΄ "IndexError: list index out of range" 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

예. λΉ„λ°€λ²ˆν˜Έκ°€ μ •ν™•ν•©λ‹ˆλ‹€. 이것은 μˆ˜λ™ λ‘œκ·ΈμΈμ„ ν•  λ•Œ μΌμ–΄λ‚˜λŠ” μΌμž…λ‹ˆλ‹€.

λΈŒλΌμš°μ €μ— 링크λ₯Ό μ”λ‹ˆλ‹€. https://company.sharepoint.com/

Enter ν‚€λ₯Ό λˆ„λ₯΄λ©΄ 둜그인 νŽ˜μ΄μ§€λ‘œ λ¦¬λ””λ ‰μ…˜λ©λ‹ˆλ‹€. https://login.microsoftonline.com/575...71a/oauth2/authorize?client_id=...&response_mode=form_post&response_type=code%20id_token&resource=...&scope=openid&nonce =....&redirect_uri=https :%2F%2Fcompany.sharepoint.com%2F_forms%2Fdefault.aspx&wsucxt=1&client-request-id=....

둜그인 νŽ˜μ΄μ§€μ—μ„œ 확인 λ²„νŠΌμ„ λˆ„λ₯Έ ν›„ 두 개의 λΉ λ₯Έ 링크가 ν‘œμ‹œλ˜μ—ˆμŠ΅λ‹ˆλ‹€...
첫째: https://sts.company.com/adfs/ls/wia?client-request-id=...&wa=wsignin1.0&wtrealm=urn%3afederation%3aMicrosoftOnline&wctx=LoginOptions%3D3%26estsredirect%3d2%26estsrequest%. ...&cbcxt=&μ‚¬μš©μž 이름=myemail%company.com&mkt=&lc=
... 그리고 ...
두 번째: https://login.microsoftonline.com/login.srf?client-request-id=...

그리고 λ§ˆμ§€λ§‰μœΌλ‘œ ν•„μš”ν•œ νŽ˜μ΄μ§€μ—μ„œ 멈μΆ₯λ‹ˆλ‹€.
https://company.sharepoint.com/

이 μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ©΄ μ½”λ“œ μ–΄λ”˜κ°€μ— 403 였λ₯˜κ°€ λ°œμƒν•˜λŠ” κ²ƒμœΌλ‘œ λ‚˜νƒ€λ‚¬μŠ΅λ‹ˆλ‹€.

응닡 = requests.post(url,data=SharepointOnlineAuth,headers=headers)
s = str(response.content)
인쇄물)
"b'403 포비덴"

끝점을 μ‚¬μš©ν•˜λŠ” 것을 μžŠμ—ˆμŠ΅λ‹ˆλ‹€

url=" https://login.microsoftonline.com/extSTS.srf "

urlpar

urlparse(Python 3.6.5 :: Anaconda, Inc.)와 λ™μΌν•œ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. 이것은 saml_token_provider.pyλ₯Ό μˆ˜μ •ν•˜μ—¬ ν•΄κ²°λ˜μ—ˆμŠ΅λ‹ˆλ‹€. from urllib.parse import urlparse [...] url = urlparse(self.url)

그런 λ‹€μŒ pip install lpthw.web 와 ν•¨κ»˜ μ„€μΉ˜ν•œ 웹이 λˆ„λ½λ˜μ—ˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μ§€κΈˆ λ‹€μŒκ³Ό 같은 λ¬Έμ œκ°€ λ°œμƒν•˜λ―€λ‘œ λ¬Έμ œκ°€ μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.
from web import Web File "C:\ProgramData\Anaconda3\lib\site-packages\web\__init__.py", line 14, in <module> import utils, db, net, wsgi, http, webapi, httpserver, debugerror ModuleNotFoundError: No module named 'utils'

μ•„λ‚˜μ½˜λ‹€μ— utils λͺ¨λ“ˆμ„ μ„€μΉ˜ν•©λ‹ˆλ‹€.

μ•„λ‚˜μ½˜λ‹€μ— utils λͺ¨λ“ˆμ„ μ„€μΉ˜ν•©λ‹ˆλ‹€.

감사 ν•΄μš”. utilsλ₯Ό μ„€μΉ˜ν•œ ν›„ db도 μ„€μΉ˜ν•΄μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€... νŒ¨ν‚€μ§€μ—μ„œ requirements.txtλ₯Ό ν™•μΈν•˜λŠ” 것이 μœ μš©ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

μ§€κΈˆ μΌμ–΄λ‚˜κ³  μžˆλŠ” 일은 print 문이 python3에 μ ν•©ν•˜μ§€ μ•Šλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.
print "var", var ^ SyntaxError: Missing parentheses in call to 'print'. Did you mean print("var", var)?

λ‹€μŒ 링크λ₯Ό 톡해 μ΄λ™ν•˜μ‹­μ‹œμ˜€.
https://docs.python.org/3.0/whatsnew/3.0.html

@viogp 진행 상황을 여기에 κ²Œμ‹œ

μ•ˆλ…•ν•˜μ„Έμš”. 이 라이브러리λ₯Ό μ‚¬μš©ν•˜λŠ” 데 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€.
토큰을 κ²€μƒ‰ν•˜λŠ” λ™μ•ˆ 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. AADSTS90023: STS μš”μ²­μ΄ 잘λͺ»λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
인증 μΏ ν‚€λ₯Ό κ²€μƒ‰ν•˜λŠ” λ™μ•ˆ 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.
λ°˜ν™˜ 'FedAuth=' + self.FedAuth + '; rtFa=' + self.rtFa
TypeError: str("NoneType" μ•„λ‹˜)만 str에 μ—°κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
아무도 λ‚˜λ₯Ό λ„μšΈ 수 μžˆμŠ΅λ‹ˆκΉŒ?

λΌμ΄λΈŒλŸ¬λ¦¬λŠ” κ³΅μ‹μ μœΌλ‘œ Python 2 및 Python 3 λŸ°νƒ€μž„κ³Ό ν˜Έν™˜λ˜λ―€λ‘œ 이 문제λ₯Ό μ’…λ£Œν•  것을 μ œμ•ˆν•©λ‹ˆλ‹€.

μ•ˆλ…•ν•˜μ„Έμš”,

μ‹€ν–‰ 쀑 pycharmμ—μ„œ ν”„λ‘œμ νŠΈ ν™˜κ²½μ„ μ‚¬μš©ν•  λ•Œ "ModuleNotFoundError: No module named 'office365.sharepoint.client_context'" 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ Python μ‹œμŠ€ν…œ ν™˜κ²½μ„ μ‚¬μš©ν•˜λ©΄ 잘 μž‘λ™ν•©λ‹ˆλ‹€. λ™μΌν•œ λ™μž‘μ€ Python 3.6 λ˜λŠ” 3.7을 μ‚¬μš©ν•©λ‹ˆλ‹€.

λ„μ™€μ£Όμ„Έμš”!
감사 ν•΄μš”.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰