Scraping Outlook

Salut la communauté,

Le post suivant est très intéréssant :

Mais avez-vous trouver une solution pour avoir le lien linkedin ?
Lorsque l’on click sur le bouton, ok il lance linkedin mais comment faire pour le récupérer, il n’est pas visible dans le source ???

Si vous avez une idée …

Thais

ça semble automatisable. En regardant rapidement le seul paramètre important dans lapi en question c’est l’id du contact Outlook.
Si tu veux automatiser ça, il faut:

  • creer les contacts via l’app Outlook
  • appeler l’api avec l’id du contact créé.

Ça me semble un peu complexe à mettre en œuvre.
Si tu enrichis des adresses pros y’a des solutions plus simples selon moi.

Salut Boris,

Merci pour ton aide.
En fait dans l’API (sauf si mes yeux me font défauts) on ne peux pas récupérer le lien LinkedIn du profil.
Le but de l’opération est à partir d’une adresse mail (perso ou pro), d’enrichir le contact via son profil LinkedIn, si tu as d’autres idées d’ailleurs, n’hésites surtout pas ;-))

Le lien du profil LinkedIn est bien dans le résultat du call api.

Sinon pour enrichir les e-mails et trouver le LinkedIn y a des services pour ça, tu peux aussi utiliser les search google, tu peux casser l’émail en nom prénom extraire le nom de la compagnie à partir du domaine et ensuite faire une search LinkedIn avec nom prénom companyName.

Pour elles e-mails perso un peu plus compliqué.

La tu m’interesses Boris :wink:
Je veux bien que tu me dise ou tu as vu le lien linkedin dans le call api ?
Le plus simple aurait été que l’export des contacts export également le lien linkedin mais bon

Je parle bien du lien/fiche trouvé automatiquement par l’application outlook pas le lien que tu peux renseigner toi même :wink:

Voici un screenshot de l’api

1 « J'aime »

Top, merci, je vais regarder ca :wink:

Salut Les Growths,

Bon apres quelques tests, j’ai toujours des soucis avec ce scrap.
Donc j’en reviens à l’origine (je ne parle pas de l’API)

Comment faire pour trouver le lien qui se trouve derrière ce type de bouton/code ?
Je vous joins une petite photo du morceau de code, si vous avez des idées

Rien n’est apparent mais lorsque l’on clic dessus, on ouvre bien le lien

Merci d’avance pour votre aide

Pierre

Ravi d’être ton cobaye @boristchangang :joy:

De mémoire, je n’arrivais pas à automatiser la génération du token de l’ami par contre

Salut Boris,

Bon je continue a creuser ta solution ;-))
J’ai réussit à trouver comment utiliser Microsoft Graph, mais quand je l’utilise, je trouve bien mes contacts et avec l’ID d’un de es contacts, j’ai bien le détail mais pas le même que toi :frowning:
Voici mon call :
https://graph.microsoft.com/v1.0/me/contacts/AQMkADAwATNiZmYAZC1kMDUwLTg1NjAtMDACLTAwCgBGAAADOKqmipeWSEy-fMMGlNdtOwcAWiXN2vt9G0WPAAgEOAAAAWiXN2vt9G0WPpXdgvKvt3AAC3szcMAAAAA==

Utilises tu une version payante ? ou gratuite ?
Ou est ce que tu utilises autre chose que ms_graph ?

Merci pour ton aide et bonnes fêtes

Salut,

Je viens de tomber sur ton topic totalement par hasard, et il se trouve que j’ai travaillé sur le sujet pas plus tard qu’hier et réussi à mettre en place une solution. :partying_face:

J’étais parti aussi sur le call API mentionné au dessus, mais ça nécessite d’abord de créer une fiche contact pour récupérer le PersonaID et ensuite requêter l’API. J’avais bricolé une solution avec selenium pour arriver à mes fins mais j’ai trouvé encore plus rapide et moins contraignant.

Après beaucoup de recherches, de tests et d’observations cette simple requête POST suffit pour obtenir ce que tu veux :

API Path :

https://sfeur.loki.delve.office.com/api/v1/linkedin/profiles/full?ConvertGetPost=true&Smtp=iliesgraffion%40gmail.com

Ici, c’est le paramètre Smtp qui va nous intéresser. Il suffit de le remplacer par le mail du prospect désiré.

Header :

'Content-Type' : 'application/json'

Body :

{"Accept":"text/plain, application/json, text/json","X-ClientType":"OwaPeopleHub","X-ClientFeature":"LivePersonaCard","X-LPCVersion":"1.20201214.3.1","authorization":"Bearer EwAwA92CBAAU4acxddvuyAJneZCEX4Hlbc9uSaEAAS/fRFRnIgBNkGHP5vsqHVwkAQe3CSsYhYMCBh3Pbxg1zeHKP2AwU2DGTfC6CCIp6e2scVNb8XKHPSfvJ5wv3sPeXCPVZ8OC8obiO/bsOMevgSPfHZH/kOeECaT2HB7zpJYHgMvOaiy6kMle9TWhXUVIE1LTdCGETAWhSvURWbHrMV3hMh478lIpH0AkX+byVXelc3wWtCS8hQeH+4O51QLb51UagRppUdYvloXaCvk7GrD2QfGUwNfQuegd1bbeRnDgsnw1h4TzHjkBfLDznMM12xKectbIL8ZGaWZh5XyqI07ZNaZjY/bnK1NhQg8LAohtNB7k7Pn+TywxfAaVrA0DZgAACHgVR4LPAKspAAJbSEiVrKvZB8Jz9o2ZUTfTi+HU0If7mqT2MF016E5EcvzwiRMex9rXgxvvkF32ob/IjLu9lFt28BgUoTFpd15LPh5rjIEFvwsVtn+AV80kBqGCgdgSOm384qlXz+PLshVROTbeWYLqjmw2pfDccF0yDI1JGAhK2D8YBa99q1bdICJ77UyrOOOOO1VVWBAy7djFpfVp2Gf1n7WfBQFdqlpNGxV24DSo45rVZdopHjRqta2TGu3SmxhZz4jdCf8Fvob3zgKohBHCTXDKdprJzjrKmd5+8CEh/arzQ1x+E5Ss7jfk9cxb1NWDO3oFrGd+GzABcemdCvXYkK/+BtdfNVNdO9kzb4iynvw3NKUUENB8CcZPez4/7h0jzJA3O3JsYGbcQj3cJEZYcyjjeWKuelZbQ0m+ojvk0djhs4Xv82XQ3VUwCARG1ypdTWqPCatm0xgcjmC55ijTziiqucZlY2I0/KpHbyZe/Gu246A+7SUydAzrIW/S5CsW3WSa3JMf/g6D3EXkp56LaCYvG91KCLwesGWjYdlYpcyb04Om7LHGk5EL/HNHoJ2KUoXxYOBoU08wQJSG2lW9Y64yflBY+1iV50C/HydRdwwcuO1ZvCcvJqxHGsal1K+21tnoKwaobxzfgrCjAg1iHqtTNqNNXDhNEZvqXL72jp4IDdTEz7+0HUkC","X-HostAppCapabilities":"{}"}

Ce body est ensuite transformé en headers par l’API de Microsoft (va savoir pourquoi), donc tous ces paramètres sont bien à mettre dans le body en raw et non dans les headers de ta requête.

Le Bearer Token est nécessaire pour l’authentification et l’accès à l’API. Tu peux l’extraire du navigateur une fois connecté à Outlook. Il est personnel, et n’est plus utilisable dès lors que tu te logout de ton compte et que tu te reconnectes.

Tu peux le récupérer depuis la console développeur dans la section network en fouillant dans la requête person/?OlsPersonaId=AQQkADAwATNiZm… après avoir cliqué sur une de tes fiches contacts :

Et voilà ! Après tu n’as plus qu’à coller ses paramètres dans Postman ou te créer ta propre API en NodeJS ou Python :wink:

Même pas besoin d’ajouter les contacts dans Outlook ou de se servir du PersonaID après leur création.

Iliès de Visum.run :eye:


EDIT :

Petite précision toute de même concernant le Bearer Token : Ne spam pas trop car il y a une limite (par heure ou jour je ne sais pas encore) qui fera expirer ton token.

Si ça arrive, un message d’erreur te sera retourné par l’API. Tu n’auras qu’à te déconnecter et te reconnecter d’Outlook pour générer un nouveau token et le copier conformément aux instructions au dessus.

Voici le résultat complet de l’API quand il trouve un profil (ici c’est le mien) :

{
    "resultTemplate": "ExactMatch",
    "bound": true,
    "bindUrl": "https://login.live.com/accountbind.srf?provider=linkedin.com&redirect_uri=https://loki.delve.office.com/linkedInAuthRedirect.aspx&client_id=000000004C1E916B&dualbind=1&mkt=&external_app=Owa&dualbindmobile=True",
    "persons": [
        {
            "id": "urn:li:person:DgFCGRHxENv_VYOIJUAP0ixeer-eGf037HN4DJRMA3Q",
            "displayName": "Iliès Graffion",
            "headline": "Co-founder at ⛅ Repos Digital & 👁️ Visum.run⠀⠀⠀ ⠀⠀⠀⠀ ⠀Made in @StationF",
            "companyName": "Repos Digital",
            "location": "Greater Paris Metropolitan Region",
            "photoUrl": "https://media.licdn.com/dms/image/C4D03AQHY9JVjFeZruw/profile-displayphoto-shrink_400_400/0?e=1614211200&v=beta&t=s_253lBxoNoZVWKa3Zj85tNkZWGExJnVHyIX-3eIxtA",
            "linkedInUrl": "https://www.linkedin.com/in/iliesgraffion",
            "reportProfileUrl": "https://www.linkedin.com/in/iliesgraffion/report",
            "connectionCount": 500,
            "isConnectionCountObfuscated": true,
            "connectionDegree": "Self",
            "connectionStatus": "NotConnected",
            "skills": [],
            "locale": {
                "country": "us",
                "language": "en"
            },
            "schools": {
                "educationsCount": 4,
                "educationHistory": [
                    {
                        "school": {
                            "schoolName": "ESILV - Ecole Supérieure d'Ingénieurs Léonard de Vinci",
                            "schoolLocation": "Courbevoie, ��le-de-France, France",
                            "schoolLogo": "https://media.licdn.com/dms/image/C560BAQG69M6NumF8QQ/company-logo_400_400/0/esilvparis_logo?e=1614211200&v=beta&t=o2cInG66AOaHPWSnpyey9ufiVA4JPbttr0dp_1Du650",
                            "linkedInUrl": "https://www.linkedin.com/edu/school?id=42867"
                        },
                        "degreeName": "Engineering degree",
                        "startEndDate": {
                            "start": {
                                "year": 2017
                            },
                            "end": {
                                "year": 2020
                            }
                        },
                        "fieldOfStudy": "Computers, Big Data and Connected Objects",
                        "schoolName": "ESILV - Ecole Supérieure d'Ingénieurs Léonard de Vinci",
                        "schoolLocation": "Courbevoie, ��le-de-France, France",
                        "schoolLogo": "https://media.licdn.com/dms/image/C560BAQG69M6NumF8QQ/company-logo_400_400/0/esilvparis_logo?e=1614211200&v=beta&t=o2cInG66AOaHPWSnpyey9ufiVA4JPbttr0dp_1Du650",
                        "linkedInUrl": "https://www.linkedin.com/edu/school?id=42867"
                    },
                    {
                        "school": {
                            "schoolName": "Université Paris Nanterre",
                            "schoolLocation": "Nanterre, ��le-de-France, France",
                            "schoolLogo": "https://media.licdn.com/dms/image/C4D0BAQF-aQ6o5egnhQ/company-logo_400_400/0?e=1614211200&v=beta&t=ebaHqzBHa3Xu6NZ0diZmw0j_dVZ1o_1_uZBIBA7bLVQ",
                            "linkedInUrl": "https://www.linkedin.com/edu/school?id=12550"
                        },
                        "degreeName": "D2E",
                        "startEndDate": {
                            "start": {
                                "year": 2020
                            },
                            "end": {
                                "year": 2021
                            }
                        },
                        "fieldOfStudy": "Entrepreneuriat",
                        "schoolName": "Université Paris Nanterre",
                        "schoolLocation": "Nanterre, ��le-de-France, France",
                        "schoolLogo": "https://media.licdn.com/dms/image/C4D0BAQF-aQ6o5egnhQ/company-logo_400_400/0?e=1614211200&v=beta&t=ebaHqzBHa3Xu6NZ0diZmw0j_dVZ1o_1_uZBIBA7bLVQ",
                        "linkedInUrl": "https://www.linkedin.com/edu/school?id=12550"
                    },
                    {
                        "school": {
                            "schoolName": "Conservatoire National des Arts et Métiers",
                            "schoolLocation": "France",
                            "schoolLogo": "https://media.licdn.com/dms/image/C4D0BAQGRQuv1v-KRxQ/company-logo_400_400/0/conservatoire_national_des_arts_et_mtiers_logo?e=1614211200&v=beta&t=WEajeVY1nbDekU0Xrs9ZjT2myRyXXTrZ7roxfAXauOg",
                            "linkedInUrl": "https://www.linkedin.com/edu/school?id=12298"
                        },
                        "degreeName": " Professional License Computer Systems and Database",
                        "startEndDate": {
                            "start": {
                                "year": 2015
                            },
                            "end": {
                                "year": 2016
                            }
                        },
                        "fieldOfStudy": " Analyst-Designer in Information and Decision System (ACSID)",
                        "schoolName": "Conservatoire National des Arts et Métiers",
                        "schoolLocation": "France",
                        "schoolLogo": "https://media.licdn.com/dms/image/C4D0BAQGRQuv1v-KRxQ/company-logo_400_400/0/conservatoire_national_des_arts_et_mtiers_logo?e=1614211200&v=beta&t=WEajeVY1nbDekU0Xrs9ZjT2myRyXXTrZ7roxfAXauOg",
                        "linkedInUrl": "https://www.linkedin.com/edu/school?id=12298"
                    }
                ]
            },
            "positions": {
                "positionsCount": 8,
                "positionHistory": [
                    {
                        "title": "Co-founder & CTO",
                        "startEndDate": {
                            "start": {
                                "month": 7,
                                "year": 2020
                            },
                            "end": {}
                        },
                        "description": "Repos Digital vous accompagne dans la suppression des données et la résiliation des contrats d'un défunt.",
                        "company": {
                            "companyName": "Repos Digital",
                            "companyLocation": "Paris, ��le-de-France, France",
                            "companyLogo": "https://media.licdn.com/dms/image/C4E0BAQFN0VMFEpvj1Q/company-logo_400_400/0?e=1614211200&v=beta&t=nL3munCdk7wI8urxGkcWBPq0e6Xu-Z-YnF5v2APUrzo",
                            "linkedInUrl": "https://www.linkedin.com/company/65841732/"
                        },
                        "companyName": "Repos Digital",
                        "companyLocation": "Paris, ��le-de-France, France",
                        "companyLogo": "https://media.licdn.com/dms/image/C4E0BAQFN0VMFEpvj1Q/company-logo_400_400/0?e=1614211200&v=beta&t=nL3munCdk7wI8urxGkcWBPq0e6Xu-Z-YnF5v2APUrzo",
                        "linkedInUrl": "https://www.linkedin.com/company/65841732/"
                    },
                    {
                        "title": "DevOps Engineer Apprentice",
                        "startEndDate": {
                            "start": {
                                "month": 8,
                                "year": 2017
                            },
                            "end": {
                                "month": 7,
                                "year": 2020
                            }
                        },
                        "description": "Integration and development of tools on PaaS Cloud Foundry and OpenShift.\nImplementation of a Development and Continuous Integration pipeline.",
                        "company": {
                            "companyName": "Orange",
                            "companyLocation": "Orange Gardens - Châtillon",
                            "companyLogo": "https://media.licdn.com/dms/image/C4D0BAQEIG5RkDRNPvg/company-logo_400_400/0/orange_logo?e=1614211200&v=beta&t=_8MUE3stUXmGfRwNdbDP3Sh5P2rhU3v9osZ5VtlhjvY",
                            "linkedInUrl": "https://www.linkedin.com/company/1110/"
                        },
                        "companyName": "Orange",
                        "companyLocation": "Orange Gardens - Châtillon",
                        "companyLogo": "https://media.licdn.com/dms/image/C4D0BAQEIG5RkDRNPvg/company-logo_400_400/0/orange_logo?e=1614211200&v=beta&t=_8MUE3stUXmGfRwNdbDP3Sh5P2rhU3v9osZ5VtlhjvY",
                        "linkedInUrl": "https://www.linkedin.com/company/1110/"
                    },
                    {
                        "title": "Digital Art Director",
                        "startEndDate": {
                            "start": {
                                "month": 1,
                                "year": 2018
                            },
                            "end": {
                                "month": 9,
                                "year": 2018
                            }
                        },
                        "description": "Project based on the Ethereum blockchain consisting in securing the transfer of its funds in cryptocurrencies and any file or media, in the event of death.",
                        "company": {
                            "companyName": "Recovery LTD",
                            "companyLocation": "Greater Paris Metropolitan Region",
                            "companyLogo": "https://media.licdn.com/dms/image/C560BAQEGXTEEekfnww/company-logo_400_400/0/recovery_pm_logo?e=1614211200&v=beta&t=pNykwTHEnrr9W4845jwpzbnmCOt0CcD0LD0zIY_6Gss",
                            "linkedInUrl": "https://www.linkedin.com/company/18543335/"
                        },
                        "companyName": "Recovery LTD",
                        "companyLocation": "Greater Paris Metropolitan Region",
                        "companyLogo": "https://media.licdn.com/dms/image/C560BAQEGXTEEekfnww/company-logo_400_400/0/recovery_pm_logo?e=1614211200&v=beta&t=pNykwTHEnrr9W4845jwpzbnmCOt0CcD0LD0zIY_6Gss",
                        "linkedInUrl": "https://www.linkedin.com/company/18543335/"
                    }
                ]
            },
            "skillEndorsements": {
                "skillEndorsementsCount": 3,
                "skillEndorsements": [
                    {
                        "skillName": "AngularJS",
                        "endorsementCount": 11,
                        "endorsers": []
                    },
                    {
                        "skillName": "Java",
                        "endorsementCount": 11,
                        "endorsers": []
                    },
                    {
                        "skillName": "PHP",
                        "endorsementCount": 10,
                        "endorsers": []
                    }
                ]
            },
            "newsMentions": {
                "newsMentionCount": 0,
                "newsMentions": []
            },
            "userGeneratedContents": {
                "userGeneratedContentCount": 2,
                "userGeneratedContents": [
                    {
                        "description": "",
                        "url": "https://www.linkedin.com/feed/update/urn:li:share:6738049258005520384",
                        "createdOn": {
                            "month": 11,
                            "year": 2020,
                            "day": 27
                        },
                        "thumbnails": [],
                        "mediaCategory": "NONE"
                    },
                    {
                        "description": "",
                        "url": "https://www.linkedin.com/feed/update/urn:li:share:6737727212352491520",
                        "createdOn": {
                            "month": 11,
                            "year": 2020,
                            "day": 26
                        },
                        "thumbnails": [],
                        "mediaCategory": "NONE"
                    }
                ]
            }
        }
    ],
    "joinNowUrl": "https://www.linkedin.com/start/join"
}

Amusez vous bien, c’est très pratique pour enrichir son CRM :wink:

2 « J'aime »

Bonjour;

Ca c’est une très bonne nouvelle.
Il faut que je regarde parceque je ne suis vraiment pas très a l’aise avec l’API Microsoft :frowning:
D’ailleurs, si tu as un bout de code python a m’envoyer en MP je suis preneur :wink:

Hello, ça marche encore ?