白鷺祭作品紹介2023
【白鷺祭23】名簿確認スクリプト
公開日:
2024/03/16
【白鷺祭23】名簿確認スクリプト

前書き

部活の部長や学生団体の責任者は名簿がしっかりとあっているかどうか結構不安だと思います。

そういう人たちのためにテキストファイルに保存した名前が大学のシステムにあるかどうかを問い合わせるスクリプトを作りました。全文は以下の通りです。

info
プログラミングやWebの理解がある人じゃないと実行できません

コード

import requests
import json

# めるあどは自分の大学のメルアドのドットとアットをアンダーバーに置き換えたもの
def createRequest(name):
	url = 'https://omunet-my.sharepoint.com/personal/めるあど/_api/SP.UI.ApplicationPages.ClientPeoplePickerWebServiceInterface.ClientPeoplePickerSearchUser'
	payload = ("{\"queryParams\":{\"QueryString\":\""+name+"\",\"MaximumEntitySuggestions\":60,\"AllowEmailAddresses\":true,\"PrincipalType\":13,\"PrincipalSource\":15,\"UseSubstrateSearch\":true,\"QuerySettings\":{\"ExcludeAllUsersOnTenantClaim\":false,\"IsSharing\":true}}}").encode('utf-8')
	headers = {
        "Accept": "application/json;odata=verbose",
		"Authorization": "Bearer",
        "Content-Type": "application/json;odata=verbose",
        "CollectSPPerfMetrics": "SPSQLQueryCount",
		'Cookie': '長いCookie' ,
        "x-requestdigest": "RequestDigestをここに入れる"
	}
	r = requests.post(url, data=payload, headers=headers)
	if r.json()['d']['ClientPeoplePickerSearchUser'] != '[]':
		user = json.loads(r.json()['d']['ClientPeoplePickerSearchUser'])[0]
		name = user['DisplayText']
		mail = user['Description']
		dep = user['EntityData']['Department']
		print(json.dumps({"name":name,"mail":mail,"dep":dep}, allow_nan=True, ensure_ascii=False))
		return 200
	else:
		return 404

def insertspace(name, position):
	return name[:position] + ' ' + name[position:]

# read members.txt by line
with open('members.txt', 'r', encoding='utf-8') as f:
	lines = f.readlines()
	for line in lines:
		name = line.replace("\n","")
		last_status = 404
		for i in range(1, len(name)):
			name_spaced = insertspace(name, i)
			result = createRequest(name_spaced)
			if result == 200:
				last_status = 200
				break
		if last_status == 404:
			print(name, " is REALLY NOT FOUND in O365.")

続いて実行ログ

{"name": "〇〇 〇〇", "mail": "xxxxx@st.omu.ac.jp", "dep": "生命機能科学科"}
{"name": "〇〇 〇〇", "mail": "xxxxx@st.omu.ac.jp", "dep": "機械工学科"}
{"name": "〇〇 〇〇", "mail": "xxxxx@st.omu.ac.jp", "dep": "応用化学科"}
{"name": "〇〇 〇〇", "mail": "xxxxx@st.omu.ac.jp", "dep": "電気電子システム工学科"}
{"name": "〇〇 〇〇", "mail": "xxxxx@st.omu.ac.jp", "dep": "情報工学科"}

傾向と対策 (いってみたかっただけ)

これは大学のシステムに直接問い合わせているのではなく、大学のアカウント情報とOffice 365 (以下O365)が正しく同期されているという仕様を利用したものです。

また、OneDrive (Web版)ではファイルを共有するときにメルアドや名前を入力することでその組織内にいる人を検索できるので上のコードはそれを叩いた結果を処理しています。

名前の一部を指定し、返ってくるデータはフルネーム、学科、メルアドが返ってきます。

その他

詳しいことは白鷺祭終わってから書きます。自分が白鷺祭の委員なので時間なくてやばい、たすけて

一緒に読まれている記事
記事がありません。