Introduction
In this article I have tried to create a toolkit through a small set of controls that allow the synchronization of information via Linkedin such as Contacts.
The toolkit is made by Statto C # ajax on the model and predict the creation of a ScriptManager js that all amounts required to instantiate the API calls to the world Linkedin.
The dialogue with the Linkedin system requires a exchange their credentials through a redirect on the login system of the web platform.
Background
The code described in this article allows you to create easily one schmea of API calls to retrieve all the information related to your contacts in linkedin.
The ability to perform a query on the platform linkedin requires that the application you are using has at its disposal a APIKEY issued by the web linkeind
To understand how it is possible to obtain a APIKEY refer to the links provided below:
http://developer.linkedin.com/documents/sign-linkedin
http://developer.linkedin.com/
The operations of the request to the API linkedin require an exchange of credentials through the support provided by token generated dynamically and which allows to obtain authorization to send operations web credentials to the access area of Linkedin.
The transfer of information from the web client to tunnel linkedin is guaranteed by TLS or SSL enabled on browsere allows for secure sending of our credentials.
All the necessary script is contained within http://platform.linkedin.com/in.js
Using the code
Briefly present the code needed to create the ScriptManager
that will allow the import of the information entered in the files are embedded inseritinella library:
This script can be inserted within any file
API LINKEDIN
<script type="text/javascript" src="http://platform.linkedin.com/in.js">
api_key: your key
onLoad: onLinkedInLoad
scope: r_fullprofile r_network r_contactinfo rw_groups w_messages rw_nus
authorize: true
credentials_cookie: true
credentials_cookie_crc: true
</script>
<script type="text/javascript">
function onLinkedInLoad(){
IN.Event.on(IN, "auth", onLinkedInAuth);}
function onLinkedInAuth() {
if (document.getElementById("compania")) {
IN.API.Raw("/people/~/suggestions/job-suggestions").method("GET").result(function (result) {
document.getElementById("compania").innerHTML = "";
for (i = 0; i < result.jobs.values.length; i++) {
document.getElementById("compania").innerHTML += "<table><tr><td><img src=\"../img/icon_no_ company.gif\"></td><td><div style=\"font-size:14px;color:#006699;padding-bottom:5px;font-weight:bold;\">" + result.jobs.values[i].company.name + "</div>" + result.jobs.values[i].descriptionSnippet + "</td></tr></table><br/>" + "<br/><div style=\"border-bottom:1px dotted #a0a0a0\"/>";
}
})
.error(function error(e) { alert("Error" + JSON.stringify(e)) });
}
if (document.getElementById("connectionsdata")) {
IN.API.Connections("me").fields("id", "firstName", "lastName", "pictureUrl", "publicProfileUrl").result(function (result, metadata) {
setConnections(result.values, metadata);
});
}
}
function setConnections(connections) {
var connHTML = "<ul>";
for (id in connections) {
connHTML = connHTML + "<li><a href=\"" + connections[id].publicProfileURL + "\">";
if (connections[id].hasOwnProperty('pictureUrl')) {
connHTML = connHTML + "<img align=\"baseline\" src=\"" + connections[id].pictureUrl + "\"></a>";
} else {
connHTML = connHTML + "<img align=\"baseline\" src=\"http://static02.linkedin.com/scds/common/u/img/icon/icon_no_photo_80x80.png\"></a>";
}
connHTML = connHTML + " <a href=\"" + connections[id].publicProfileUrl + "\">";
connHTML = connHTML + connections[id].firstName + " " + connections[id].lastName + "</a></li>";
}
connHTML = connHTML + "</ul>";
document.getElementById("connectionsdata").innerHTML = "";
document.getElementById("connectionsdata").innerHTML = connHTML;
}
Briefly present the code needed to create the ScriptManager
that will allow the import of the information entered in the files are embedded inseritinella library:
Personally I prefer to use a RESX file indexed by a voice Resources.Resource.ScriptManager
.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
[System.Drawing.ToolboxBitmap(typeof(LinkedinContacts), "img.My_linkedin_icon.bmp")]
[DefaultProperty("Text")]
[ToolboxData("<{0}:LinkedinScriptManager runat="server"></{0}:LinkedinScriptManager>")]
public class LinkedinScriptManager : WebControl
{
[Bindable(false)]
[DefaultValue("")]
[Browsable(false)]
public string pathJsBase;
<span class="Apple-tab-span" style="white-space: pre; "> </span> [B [Category("Appearance")]
[DefaultValue("")]
[Localizable(true)]
public string APIKEY
{
get
{
String s = (String)ViewState["APIKEY"];
return ((s == null) ? String.Empty : s);
}
set
{
ViewState["APIKEY"] = value;
}
}
protected override void OnInit(EventArgs e)
{
if (this.APIKEY != string.Empty)
{
base.OnInit(e);
Page.Init += delegate(object sender, EventArgs e_Init)
{
pathJsBase = Resources.Resource.ScriptManager;
Literal linkJs = new Literal();
linkJs.Text = pathJsBase.Replace("{#}", this.APIKEY);
Control head = null;
head = findControl(Page.Controls, typeof(System.Web.UI.HtmlControls.HtmlHead));
if (head != null)
if (linkJs.Text != string.Empty) head.Controls.Add(linkJs);
};
}
}
public System.Web.UI.Control findControl(System.Web.UI.ControlCollection inCollectionControls, Type inTypeControlType)
{
System.Web.UI.Control outControlGeneric;
System.Web.UI.Control curControl;
for (int i = 0; i < inCollectionControls.Count; i++)
{
curControl = inCollectionControls[i];
if (curControl.GetType() == inTypeControlType)
{
outControlGeneric = curControl;
return outControlGeneric;
}
if (curControl.Controls.Count > 0)
{
outControlGeneric = findControl(curControl.Controls, inTypeControlType);
if (outControlGeneric != null)
return outControlGeneric;
}
}
return null;
}
protected override void Render(HtmlTextWriter output) { }
}
Points of Interest
This article allows you to interact with protocol OAuth 2.0 and to understand some patterns. The protocol allows to understand the use of the Token system used in different steps. It also allows you to have fun with the mechanisms of retrograde asynchronously by using JSON and AJAX.
History
Updated the article based on comments received.