drexelforchrist/collegiatelink-php

自动访问CollegiateLink内容。

dev-master 2018-02-08 18:54 UTC

This package is auto-updated.

Last update: 2024-09-14 18:42:08 UTC


README

这是一个用于与CollegiateLink交互的PHP API,CollegiateLink是CampusLabs提供给大学使用的服务,用于管理学生组织。此API在任何方式下均未获得CampusLabs的授权、批准或支持。

许可证

不要违法。不要违反您机构的用户协议。不要尝试使用此API访问不属于您的数据(这种尝试也不会成功)。否则,自行承担风险地使用此API。贡献者不对您的行为承担责任。

如果您扩展或改进此API,您至少应考虑提交一个pull request。

安装

使用Composer。

composer require drexelforchrist/collegiatelink-php
composer install

先决条件

  • PHP >5.5
  • 了解如何编写PHP的基本知识。

动机

对于校园领导者来说,CollegiateLink难以用于有意义的生产力。例如,没有将其与学生会外部网站集成的途径。此API旨在帮助解决这个问题。本质上,此API仅仅模拟用户行为。

使用

在使用API之前,您需要作为授权用户进行身份验证。如果您只是作为一个独立的项目进行此操作,您可能会发现使用包含的aCurl和dom-parser子模块(这两个模块都是此API所必需的)来模拟浏览器中的用户最为容易。

身份验证

首先,您必须通过学校的身份验证系统进行身份验证。此项目的维护者与德雷塞尔大学有关联,对于我们来说,身份验证完全由以下'authenticate'函数处理:(这是一个有效的方法,但还有很多改进的空间。)

function authenticate() {
	global $TASK;

	try {

		/* Request standard page, via log in if needed */
		$c = "";
		set_time_limit(30);
		$c = new aCurl("https://drexel.collegiatelink.net/account/logon");
		$c->setCookieFile($TASK['cookie']);
		$c->includeHeader(false);
		$c->maxRedirects(5);
		$c->createCurl();

		if ($c->getInfo()['url'] == "https://federation.campuslabs.com/?wa=wsignin1.0&wtrealm=https%3a%2f%2fdrexel.collegiatelink.net%2fexternalauthentication%2ffederationresult%2f&wctx=https%3a%2f%2fdrexel.collegiatelink.net%2faccount%2flogon") {
			$h = new simple_html_dom((string)$c);
			$form = $h->find('form[name="hiddenform"]', 0);

			$posts = array();
			foreach($form->find('input') as $in) {
				$posts[$in->name] = html_entity_decode($in->value);
			}

			unset($c, $h);

			$c = "";
			$c = new aCurl($form->action);
			$c->setCookieFile($TASK['cookie']);
			$c->setPost(http_build_query($posts));
			$c->maxRedirects(5);
			$c->includeHeader(false);
			$c->createCurl();
			unset($posts);
		}


		if ($c->getInfo()['url'] == "https://login.drexel.edu/cas/login?service=https://jcf.irt.drexel.edu/authenticate") {
			/* need to authenticate through CAS. */

			/* Drexel CAS */
			$h = new simple_html_dom((string)$c);
			if ($a = $h->find('a',0)) {

				if ($a->innerText() == "here") {
					$c = "";
					set_time_limit(30);
					$c = new aCurl($a->href);
					$c->setCookieFile($TASK['cookie']);
					$c->maxRedirects(5);
					$c->includeHeader(false);
					$c->createCurl();

					return 1;
				}
			}
			$form = $h->find('form[id="fm1"]', 0);
			foreach($form->find('input') as $in) {
				$posts[$in->name] = html_entity_decode($in->value);
			}

			unset($c, $h);

			$posts['username']=USERNAME;
			$posts['password']=PASSWORD;

			$c = "";
			set_time_limit(30);
			$c = new aCurl("https://login.drexel.edu".html_entity_decode($form->action));
			$c->setCookieFile($TASK['cookie']);
			$c->setPost(http_build_query($posts));
			$c->maxRedirects(5);
			$c->includeHeader(false);
			$c->createCurl();
			unset($posts);

		}


		if (substr($c->getInfo()['url'],0,38) === "https://federation.campuslabs.com/gpt?") {
			/* cLink Federation.  This request gets us "in" */

			$h = new simple_html_dom((string)$c);
			$form = $h->find('form[name="hiddenform"]', 0);

			$posts = array();
			foreach($form->find('input') as $in) {
				$posts[$in->name] = html_entity_decode($in->value);
			}

			unset($c, $h);

			$c = "";
			set_time_limit(30);
			$c = new aCurl($form->action);
			$c->setCookieFile($TASK['cookie']);
			$c->setPost(http_build_query($posts));
			$c->maxRedirects(5);
			$c->includeHeader(false);
			$c->createCurl();
			unset($posts);
		}

		return 1;
	} catch (Exception $e) {
		return 0;
	}
}

示例用例

为了这些演示,我们将假设您是德雷塞尔基督学生组织的领导者,这是德雷塞尔大学的一个学生组织(org)。(你看,这正是我的情况。)

所有用例都以CollegiateLink类的对象开始,该对象可以在您的脚本中的后续调用中重复使用,如果您希望这样做。我们将把这个对象的实例称为"clink"。Clink是通过以下方式创建的

$cookie = "collegiatelinkCookie.cky";
$baseUrl = "https://drexel.collegiatelink.net/";

$clink = new CollegiateLink($baseUrl, $cookie);

组织

此API的大部分操作旨在使组织领导者能够在一定程度上自动化他们的行政负担。对于组织领导者,有关组织的操作是通过org类的对象完成的。如果您想要为特定的组织创建一个org对象,可以这样操作

$dfc = $clink->getOrganization("drexelforchrist");

其中$clink与我们之前定义的是相同的,并且"drexelforchrist"是组织页面的URL的特定部分。也就是说,https://drexel.collegiatelink.net/organizations/drexelforchrist会导致"drexelforchrist"。

个人

我们将处理的最简单的个人类型是组织的"成员"。

要获取给定组织的成员列表(Person对象数组)

$dfc->getProspectiveMembers()

其中$dfc与我们上面定义的是相同的。

因此,现在您有一个包含个人对象的数组,但您可以做什么呢?好吧,在CollegiateLink上用户"联系卡"上显示的大部分信息都可以通过此API编程访问。

如果您想打印出一份包含成员的列表,包括他们的社区成员ID(CollegiateLink特定的用户ID号码)、全名、电子邮件地址、Facebook个人资料(如果他们列出的话),甚至他们的个人照片,这将做到这一点。

echo "<table>";
foreach ($dfc->getMembers() as $num => $mem) {
    echo "<tr><td>$num</td>";
    echo "<td>";
    echo $mem->CommunityMemberId;
    echo "</td>";
    echo "<td>";
    echo $mem->getFullName();
    echo "</td>";
    echo "<td>";
    echo $mem->getEmailAddr();
    echo "</td>";
    echo "<td>";
    echo $mem->FacebookProfile;
    echo "</td>";
    echo "<td>";
    $p = $mem->getLargeProfilePicture();
    if ($p!==false) {
        echo "<img src=\"$p\" />";
    }
    echo "</td>";
    echo "</tr>";
}
echo "</table>";

就这样,我们解决了CollegiateLink最大的抱怨之一:轻松导出成员的电子邮件地址。

其他所有内容

整个API都使用PHPDocs进行了文档化,这些文档可以在“文档”目录中轻松阅读。