ā§Ŧ.ā§Ģ āĻāĻŋāĻāĻšāĻžāĻŦ – āϏā§āĻā§āϰāĻŋāĻĒā§āĻāĻŋāĻ āĻāĻŋāĻāĻšāĻžāĻŦ
āϏā§āĻāĻžāĻā§āϝāĻŦāĻļāϤ, GitHub āĻ āύā§āĻ āĻāĻĒāĻžāϝāĻŧā§ āĻŦā§āĻļ āϏāĻšāĻā§ āĻĒāϰāĻŋāĻŦāϰā§āϤāύāϝā§āĻā§āϝ (hackable) āĨ¤ āĻāĻ āĻ āϧā§āϝāĻžā§ā§ āĻāĻŽāϰāĻž āĻāĻāĻžāϰ āĻāϰāĻŦ āĻāĻŋāĻāĻžāĻŦā§ āĻāĻŋāĻāĻšāĻžāĻŦ āĻšā§āĻ (Hook) āϏāĻŋāϏā§āĻā§āĻŽ āĻāĻŦāĻ āĻāϰ API āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻŋāĻāĻšāĻžāĻŦāĻā§ āĻāĻā§āĻā§āĻŽāϤ āĻāĻžāĻā§ āϞāĻžāĻāĻžāϤ⧠āĻĒāĻžāϰāĻŋāĨ¤
āϏāĻžāϰā§āĻāĻŋāϏ āĻāĻŦāĻ āĻšā§āĻ (Service and Hooks)
āĻāĻŋāĻāĻšāĻžāĻŦ āϰāĻŋāĻĒā§āĻāĻŋāĻāϰāĻŋ āĻ ā§āϝāĻžāĻĄāĻŽāĻŋāύāĻŋāϏā§āĻā§āϰā§āĻļāύā§āϰ āĻšā§āĻāϏ āĻāĻŦāĻ āϏāĻžāϰā§āĻāĻŋāϏā§āϏ āĻšāϞ āĻāĻŋāĻāĻšāĻžāĻŦāĻā§ āĻāĻā§āϏāĻāĻžāϰāύāĻžāϞ āϏāĻŋāϏā§āĻā§āĻŽā§āϰ āϏāĻžāĻĨā§ āĻāύā§āĻāĻžāϰāĻ ā§āϝāĻžāĻā§āĻ āĻāϰāĻžāϰ āϏāĻŦāĻā§āϝāĻŧā§ āϏāĻšāĻāϤāĻŽ āĻāĻĒāĻžāϝāĻŧāĨ¤āϏāĻžāϰā§āĻāĻŋāϏāϏāĻŽā§āĻš (Services)
āĻĒā§āϰāĻĨāĻŽā§ āĻāĻŽāϰāĻž āϏāĻžāϰā§āĻāĻŋāϏāĻā§āϞ⧠āĻĻā§āĻā§ āύā§āĻŦāĨ¤ āĻāĻĒāύāĻžāϰ āϰāĻŋāĻĒā§āĻāĻŋāĻāϰāĻŋāϰ āϏā§āĻāĻŋāĻāϏ⧠āĻšā§āĻ āĻāĻŦāĻ āϏāĻžāϰā§āĻāĻŋāϏ āĻāύā§āĻāĻŋāĻā§āϰā§āĻļāύ āĻāĻāϝāĻŧāĻ āĻĒāĻžāĻāϝāĻŧāĻž āϝāĻžāĻŦā§, āϝā§āĻāĻžāύ⧠āĻāĻŽāϰāĻž āĻĒā§āϰā§āĻŦā§ Collaborators āϝā§āĻ āĻāϰāĻžāϰ āĻāĻŦāĻ āĻāĻĒāύāĻžāϰ āĻĒā§āϰā§āĻā§āĻā§āĻā§āϰ āĻĄāĻŋāĻĢāϞā§āĻ āĻŦā§āϰāĻžāĻā§āĻ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰāĻžāϰ āĻŦāĻŋāώāϝāĻŧā§ āĻĻā§āĻā§āĻāĻŋāĨ¤ “Webhooks and Services” āĻā§āϝāĻžāĻŦā§āϰ āĻ āϧā§āύ⧠āĻāĻĒāύāĻŋ āϏāĻžāϰā§āĻāĻŋāϏ āĻāĻŦāĻ āĻšā§āĻāϏ āĻāύāĻĢāĻŋāĻāĻžāϰā§āĻļāύ āĻŦāĻŋāĻāĻžāĻ āĻĻā§āĻāϤ⧠āĻĒāĻžāĻŦā§āύāĨ¤
āĻāĻĒāύāĻŋ āĻŦā§āĻā§ āύāĻŋāϤ⧠āĻĒāĻžāϰā§āύ āĻāĻŽāύ āĻĄāĻāύ āĻĄāĻāύ āϏāĻžāϰā§āĻāĻŋāϏ āϰāϝāĻŧā§āĻā§, āϝāĻžāϰ āĻŦā§āĻļāĻŋāϰāĻāĻžāĻāĻ āĻ āύā§āϝāĻžāύā§āϝ āĻŦāĻžāĻŖāĻŋāĻā§āϝāĻŋāĻ āĻāĻŦāĻ āĻāĻĒā§āύ āϏā§āϰā§āϏ āϏāĻŋāϏā§āĻā§āĻŽā§ āĻāύā§āĻāĻŋāĻā§āϰā§āĻļāύ āĻšāϝāĻŧ⧎ āϤāĻžāĻĻā§āϰ āĻŦā§āĻļāĻŋāϰāĻāĻžāĻāĻ āĻāύā§āĻāĻŋāύāĻŋāĻā§āĻžāϏ āĻāύā§āĻāĻŋāĻā§āϰā§āĻļāύ āϏāĻžāϰā§āĻāĻŋāϏ, āĻŦāĻžāĻ āĻāĻŦāĻ āĻāϏā§āϝ⧠āĻā§āϰā§āϝāĻžāĻāĻžāϰ, āĻā§āϝāĻžāĻ āϰā§āĻŽ āϏāĻŋāϏā§āĻā§āĻŽ āĻāĻŦāĻ āĻĄāĻā§āĻŽā§āύā§āĻā§āĻļāύ āϏāĻŋāϏā§āĻā§āĻŽā§āϰ āĻāύā§āϝāĨ¤ āĻāĻŽāϰāĻž āĻāĻāĻāĻŋ āĻā§āĻŦ āϏāĻžāϧāĻžāϰāĻŖ āĻāĻāĻāĻŋ āĻāĻŽā§āϞ āĻšā§āĻ āϏā§āĻ āĻāĻĒ āĻāϰāĻžāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻļā§āϰ⧠āĻāϰāĻŦ⧎ āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ “Add Service” āĻĄā§āϰāĻĒāĻĄāĻžāĻāύ āĻĨā§āĻā§ “email” āĻŦā§āĻā§Â āύā§āύ, āĻāĻĒāύāĻŋ āĻāĻŽā§āϞ āϏāĻžāϰā§āĻāĻŋāϏ āĻāύāĻĢāĻŋāĻāĻžāϰā§āĻļāύā§āϰ āĻŽāϤ⧠āĻāĻāĻāĻŋ āĻāύāĻĢāĻŋāĻāĻžāϰā§āĻļāύ āϏā§āĻā§āϰāĻŋāύ āĻĒāĻžāĻŦā§āύāĨ¤

āĻāĻ āĻā§āώā§āϤā§āϰā§, āϝāĻĻāĻŋ āĻāĻŽāϰāĻž “add service” āĻŦāĻžāĻāύāĻāĻŋ āĻāĻžāĻĒāĻŋ, āϤāĻāύ āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻĒā§āĻļā§āϰ āĻāύā§āϝ⧠āĻāĻŽāĻžāĻĻā§āϰ āĻ āĻŋāĻ āĻāϰāĻž āĻāĻŽā§āĻāϞ⧠āĻāĻāĻāĻŋ āύā§āĻāĻŋāĻĢāĻŋāĻā§āĻļāύ āϝāĻžāĻŦā§āĨ¤ āϏāĻžāϰā§āĻāĻŋāϏāĻā§āϞāĻŋ, āĻ āύā§āĻāĻā§āϞāĻŋ āĻŦāĻŋāĻāĻŋāύā§āύ āϧāϰāĻŖā§āϰ āĻāĻā§āύā§āĻā§āϰ āĻāύā§āϝ āύā§āĻāĻŋāĻĢāĻŋāĻā§āĻļāύ āĻĒā§āϤ⧠āĻĒāĻžāϰā§, āϤāĻŦā§ āĻŦā§āĻļāĻŋāϰāĻāĻžāĻāĻ āĻā§āĻŦāϞ āĻĒā§āĻļ āĻāĻā§āύā§āĻāĻā§āϞāĻŋāϰ āĻāύā§āϝ āύā§āĻāĻŋāĻĢāĻŋāĻā§āĻļāύ āĻĒāĻžā§ āĻāĻŦāĻ āϤāĻžāϰāĻĒāϰ āϏā§āĻ āĻĄā§āĻāĻž āĻĻāĻŋāϝāĻŧā§ āĻāĻŋāĻā§ āĻāϰā§ā§ˇ
āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻā§āύ āϏāĻžāϰā§āĻāĻŋāϏ āĻāĻŋāĻāĻšāĻžāĻŦ āĻāϰ āϏāĻžāĻĨā§ āĻāύā§āĻāĻŋāĻā§āϰā§āĻ āĻāϰāϤ⧠āĻāĻžāύ, āϤāĻŦā§ āĻĒā§āϰāĻĨāĻŽā§ āĻā§āĻ āĻāϰā§āύ āϝ⧠āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻā§āύ āϏāĻžāϰā§āĻāĻŋāϏ āĻĻāĻŋā§ā§ āϤāĻž āĻāϰāĻž āϏāĻŽā§āĻāĻŦ āĻāĻŋāύāĻžāĨ¤Â āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻāĻĒāύāĻžāϰ āĻā§āĻĄāĻŦā§āϏ⧠āĻĒāϰā§āĻā§āώāĻž āĻāĻžāϞāĻžāύā§āϰ āĻāύā§āϝ āĻā§āύāĻāĻŋāύā§āϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύ , āĻāĻĒāύāĻŋ āĻā§āύāĻāĻŋāύā§āϏ āĻŦāĻŋāϞā§āĻāĻāύ āϏāĻžāϰā§āĻāĻŋāĻ¸Â āĻāύā§āĻāĻŋāĻā§āϰā§āĻļāύ āĻāύāĻžāĻŦāĻ˛Â āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ āϝāĻžāϤ⧠āĻā§āĻ āĻāĻĒāύāĻžāϰ āϰāĻŋāĻĒā§āϏāĻŋāĻā§āϰāĻŋāϤā§Â āĻĒā§āĻļ āĻāϰāϞā§āĻ āĻĒā§āϰāϤāĻŋāĻŦāĻžāϰ āĻĒāϰā§āĻā§āώāĻž āĻāĻžāϞāĻžāύ⧠āĻļā§āϰ⧠āĻšā§ā§ āϝāĻžā§āĨ¤
āĻšā§āĻāϏ
āĻāĻĒāύāĻžāϰ āϝāĻĻāĻŋ āĻāϰāĻ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻāĻŋāĻā§āϰ āĻĒā§āϰāϝāĻŧā§āĻāύ āĻšāϝāĻŧ āĻŦāĻž āĻāĻĒāύāĻŋ āĻāĻŽāύ āĻāĻāĻāĻŋ āϏāĻžāϰā§āĻāĻŋāϏ āĻŦāĻž āϏāĻžāĻāĻā§āϰ āϏāĻžāĻĨā§ āĻāύā§āĻāĻŋāĻā§āϰā§āĻ āĻāϰāϤ⧠āĻāĻžāύ āϝāĻž āĻāĻ āϤāĻžāϞāĻŋāĻāĻžāϝāĻŧ āĻ āύā§āϤāϰā§āĻā§āĻā§āϤ āύāϝāĻŧ, āĻāĻĒāύāĻŋ āĻĒāϰāĻŋāĻŦāϰā§āϤ⧠āĻāϰāĻ āĻā§āύā§āϰāĻŋāĻ āĻšā§āĻ āϏāĻŋāϏā§āĻā§āĻŽ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤ āĻāĻŋāĻāĻšāĻžāĻŦ āϰāĻŋāĻĒā§āĻāĻŋāĻāϰāĻŋ āĻšā§āĻāĻā§āϞāĻŋ āĻŦā§āĻļ āϏāĻšāĻāĨ¤ āĻāĻĒāύāĻŋ āĻāĻāĻāĻŋ URL āĻ āĻŋāĻ āĻāϰā§āύ āĻāĻŦāĻ GitHub āĻāĻĒāύāĻžāϰ āĻ āĻŋāĻ āĻāϰāĻžÂ āĻāĻā§āύā§āĻā§ āϏā§āĻ URL-āĻ āĻāĻāĻāĻŋ HTTP āĻĒā§āϞā§āĻĄ āĻĒā§āϏā§āĻ āĻāϰāĻŦā§āĨ¤ āϏāĻžāϧāĻžāϰāĻŖāϤ āĻāĻāĻŋ āϝā§āĻāĻžāĻŦā§ āĻāĻžāĻ āĻāϰā§, āĻāĻĒāύāĻŋ āĻāĻāĻāĻŋ GitHub āĻšā§āĻ āĻĒā§āϞā§āĻĄ āϞāĻŋāϏā§āύā§āϰ (listen) āĻāύā§āϝ āĻāĻāĻāĻŋ āĻā§āĻ āĻāϝāĻŧā§āĻŦ āϏāĻžāϰā§āĻāĻŋāϏ āϏā§āĻāĻāĻĒ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ āĻāĻŦāĻ āϤāĻžāϰāĻĒāϰ⧠āĻāĻāĻŋāϤ⧠āĻĒā§āϏā§āĻ āĻšāϞ⧠āϏā§āĻ āĻĄā§āĻāĻž āĻĻāĻŋāϝāĻŧā§ āĻāĻŋāĻā§ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤ āĻāĻāĻāĻŋ āĻšā§āĻ āĻāύāĻžāĻŦāĻ˛Â āĻāϰāϤā§, āĻāĻĒāύāĻŋ āϏāĻžāϰā§āĻāĻŋāϏ āĻāĻŦāĻ āĻšā§āĻ āĻāύāĻĢāĻŋāĻāĻžāϰā§āĻļāύ āĻŦāĻŋāĻāĻžāĻā§ “add webhook” āĻŦāĻžāĻāύāĻāĻŋ āĻā§āϞāĻŋāĻ āĻāϰā§āύ ⧎ āĻāĻāĻŋ āĻāĻĒāύāĻžāĻā§ āĻāĻāĻāĻŋ āĻĒā§āĻā§Â āύāĻŋāϝāĻŧā§ āĻāϏāĻŦā§ āϝāĻž āĻĻā§āĻāϤ⧠āĻāϝāĻŧā§āĻŦ āĻšā§āĻ āĻāύāĻĢāĻŋāĻāĻžāϰā§āĻļāύā§āϰ āĻŽāϤ⧠āĨ¤
āĻāĻāĻāĻŋ āĻāϝāĻŧā§āĻŦ āĻšā§āĻā§āϰ āĻāύāĻĢāĻŋāĻāĻžāϰā§āĻļāύ āĻŦā§āĻļ āϏāĻšāĻāĨ¤ āĻŦā§āĻļāĻŋāϰāĻāĻžāĻ āĻā§āώā§āϤā§āϰ⧠āĻāĻĒāύāĻŋ āĻā§āĻŦāϞ āĻāĻāĻāĻŋ URL āĻāĻŦāĻ āĻāĻāĻāĻŋ āϏāĻŋāĻā§āϰā§āĻ-āĻā§ āϞāĻŋāĻā§āύ āĻāĻŦāĻ “add webhook” āĻāĻžāĻĒā§āύāĨ¤ āĻāĻŋāĻā§ āĻŦāĻŋāĻāϞā§āĻĒ āϰāϝāĻŧā§āĻā§ āϝā§āĻā§āϞāĻŋāϰ āĻāύā§āϝ āĻāĻĒāύāĻŋ āĻāĻžāύ āϝ⧠āĻāĻā§āύā§āĻāĻā§āϞāĻŋāϰ āĻāύā§āϝ GitHub āĻāĻĒāύāĻžāĻā§ āĻāĻāĻāĻŋ āĻĒā§āϞā§āĻĄ āĻĒāĻžāĻ āĻžāϤ⧠â āĻĄāĻŋāĻĢāϞā§āĻ āĻšāϞ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ push āĻāĻā§āύā§āĻā§āϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻĒā§āϞā§āĻĄ āĻĒāĻžāĻāϝāĻŧāĻž, āϝāĻāύ āĻā§āĻ āĻāĻĒāύāĻžāϰ āϰāĻŋāĻĒā§āĻāĻŋāĻāϰāĻŋāϰ āϝā§āĻā§āύ⧠āĻļāĻžāĻāĻžāϝāĻŧ āύāϤā§āύ āĻā§āĻĄ āĻĒā§āĻļ āĻāϰā§āĨ¤
āĻāϏā§āύ āĻāĻāĻāĻŋ āĻāϝāĻŧā§āĻŦ āϏāĻžāϰā§āĻāĻŋāϏā§āϰ āĻāĻāĻāĻŋ āĻā§āĻ āĻāĻĻāĻžāĻšāϰāĻŖ āĻĻā§āĻāĻŋ āϝāĻžāϤā§Â āĻāĻĒāύāĻŋ āĻāĻāĻāĻŋ āĻāϝāĻŧā§āĻŦ āĻšā§āĻ āϏā§āĻ āĻāĻĒ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ⧎ āĻāĻŽāϰāĻž āϰā§āĻŦāĻŋ āĻāϝāĻŧā§āĻŦ āĻĢā§āϰā§āĻŽāĻāϝāĻŧāĻžāϰā§āĻ āϏāĻŋāύāĻžāĻā§āϰāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŦ āϝā§āĻšā§āϤ⧠āĻāĻāĻŋ āĻŽā§āĻāĻžāĻŽā§āĻāĻŋ āϏāĻāĻā§āώāĻŋāĻĒā§āϤ āĻāĻŦāĻ āĻāĻŽāϰāĻž āĻā§ āĻāϰāĻāĻŋ āϤāĻž āĻāĻĒāύāĻŋ āϏāĻšāĻā§āĻ āĻĻā§āĻāϤ⧠āϏāĻā§āώāĻŽ āĻšāĻŦā§āύāĨ¤
āϧāϰāĻž āϝāĻžāĻ āĻāĻŽāϰāĻž āĻāĻāĻāĻŋ āĻāĻŽā§āϞ āĻĒā§āϤ⧠āĻāĻžāĻ āϝāĻĻāĻŋ āĻā§āύ⧠āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻŦā§āϝāĻā§āϤāĻŋ āĻāĻāĻāĻŋ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻĢāĻžāĻāϞ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰ⧠āĻāĻŽāĻžāĻĻā§āϰ āϰāĻŋāĻĒā§āϏāĻŋāĻā§āϰāĻŋāĻ°Â āĻāĻāĻāĻŋ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻŦā§āϰāĻžāĻā§āĻā§Â āĻĒā§āĻļ āĻāϰā§āĨ¤ āĻāĻŽāϰāĻž āύāĻŋāĻā§āϰ āĻā§āĻĄāĻāĻŋāϰ āĻŽāϤāύ āĻāĻŋāĻā§ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋāĨ¤
require 'sinatra'
require 'json'
require 'mail'
post '/payload' do
push = JSON.parse(request.body.read) # parse the JSON
# gather the data we're looking for
pusher = push["pusher"]["name"]
branch = push["ref"]
# get a list of all the files touched
files = push["commits"].map do |commit|
commit['added'] + commit['modified'] + commit['removed']
end
files = files.flatten.uniq
# check for our criteria
if pusher == 'schacon' &&
branch == 'ref/heads/special-branch' &&
files.include?('special-file.txt')
Mail.deliver do
from 'tchacon@example.com'
to 'tchacon@example.com'
subject 'Scott Changed the File'
body "ALARM"
end
end
end
āĻāĻāĻžāύ⧠āĻāĻŽāϰāĻž JSON āĻĒā§āϞā§āĻĄ āύāĻŋāĻā§āĻāĻŋ āϝāĻž GitHub āĻĨā§āĻā§ āĻĒāĻžāĻā§āĻž āĻāĻŦāĻ āĻā§ āĻāĻāĻŋāĻā§ āĻĒā§āĻļ āĻāϰā§āĻā§ , āϤāĻžāϰāĻž āĻā§āύ āĻŦā§āϰāĻžāĻā§āĻā§ āĻĒā§āĻļ āĻāϰā§āĻā§Â āĻāĻŦāĻ āĻĒā§āĻļ āĻāϰāĻž āϏāĻŽāϏā§āϤ āĻāĻŽāĻŋāĻāĻā§āϞāĻŋāϤ⧠āĻā§āύ āĻĢāĻžāĻāϞāĻā§āϞāĻŋ āϏā§āĻĒāϰā§āĻļ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§ āϤāĻž āĻĻā§āĻāĻāĻŋāĨ¤ āϤāĻžāϰāĻĒāϰ⧠āĻāĻŽāϰāĻž āĻāĻŽāĻžāĻĻā§āϰ āĻā§āϰāĻžāĻāĻā§āϰāĻŋā§āĻž āĻ āύā§āϝāĻžā§ā§ āϝāĻĻāĻŋ āĻŽā§āϞ⧠āϤāĻŦā§ āĻāĻāĻāĻŋ āĻāĻŽā§āϞ āĻĒāĻžāĻ āĻžāĻāĨ¤
āĻāĻāϰāĻāĻŽ āĻāĻŋāĻā§ āĻĄā§āĻā§āϞāĻĒ āĻāĻŦāĻ āĻā§āϏā§āĻ āĻāϰāĻžāϰ āĻāύā§āϝ, āĻāĻĒāύāĻžāϰ āĻāĻžāĻā§ āĻāĻāĻ āϏā§āĻā§āϰāĻŋāύ⧠āĻāĻāĻāĻŋ āĻĄā§āĻā§āϞāĻĒāĻŋāĻ āĻāύāϏā§āϞ āϰāϝāĻŧā§āĻā§ āϝā§āĻāĻžāύ⧠āĻāĻĒāύāĻŋ āĻšā§āĻ āϏā§āĻ āĻāϰā§āĻā§āύ⧎ āĻāĻĒāύāĻŋ āĻļā§āώ āĻāϝāĻŧā§āĻāĻāĻŋ āĻĄā§āϞāĻŋāĻāĻžāϰāĻŋ āĻĻā§āĻāϤ⧠āĻĒāĻžāϰā§āύ āϝāĻž GitHub āϏā§āĻ āĻāϝāĻŧā§āĻŦāĻšā§āĻā§āϰ āĻāύā§āϝ āϤā§āϰāĻŋ āĻāϰāĻžāϰ āĻā§āώā§āĻāĻž āĻāϰā§āĻā§āĨ¤ āĻĒā§āϰāϤāĻŋāĻāĻŋ āϏāĻĢāĻ˛Â āĻšā§āĻā§āϰ āĻāύā§āϝ āĻāĻĒāύāĻŋ āĻĻā§āĻāϤā§Â āĻĒāĻžāϰā§āύ āĻāĻāύ āĻāĻāĻŋ āĻĄā§āϞāĻŋāĻāĻžāĻ°Â āĻāϰāĻž āĻšāϝāĻŧā§āĻāĻŋāϞ, āĻāĻŦāĻ āϰāĻŋāĻā§ā§ā§āϏā§āĻ āĻāĻŦāĻ āϰā§āϏā§āĻĒāύā§āĻ¸Â āĻāĻāϝāĻŧā§āϰ āĻŦāĻĄāĻŋ āĻāĻŦāĻ āĻšā§āĻĄāĻžāϰāĨ¤ āĻāĻāĻŋ āĻāĻĒāύāĻžāϰ āĻšā§āĻāĻā§āϞāĻŋ āĻĒāϰā§āĻā§āώāĻž āĻāĻŦāĻ āĻĄāĻŋāĻŦāĻžāĻ āĻāϰāĻž āĻ āĻŦāĻŋāĻļā§āĻŦāĻžāϏā§āϝāĻāĻžāĻŦā§ āϏāĻšāĻ āĻāϰ⧠āϤā§āϞā§āĨ¤

GitHub API
āϏāĻžāϰā§āĻāĻŋāϏ āĻāĻŦāĻ āĻšā§āĻāĻā§āϞāĻŋ āĻāĻĒāύāĻžāĻā§ āĻāĻĒāύāĻžāϰ āϰāĻŋāĻĒā§āĻāĻŋāĻāϰāĻŋāĻā§āϞāĻŋāϤ⧠āĻāĻā§ āϝāĻžāĻāϝāĻŧāĻž āĻāĻā§āύā§āĻāĻā§āϞāĻŋ āϏāĻŽā§āĻĒāϰā§āĻā§ āĻĒā§āĻļ āύā§āĻāĻŋāĻĢāĻŋāĻā§āĻļāύ āĻāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āϤāĻĨā§āϝ āĻĻā§āϝāĻŧ , āϤāĻŦā§ āĻāĻ āĻāĻā§āύā§āĻāĻā§āϞāĻŋ āϏāĻŽā§āĻĒāϰā§āĻā§ āĻāĻĒāύāĻžāϰ āĻāϰāĻ āϤāĻĨā§āϝā§āϰ āĻĒā§āϰāϝāĻŧā§āĻāύ āĻšāϞ⧠āĻā§ āĻšāĻŦā§? āϏāĻšāϝā§āĻā§āĻĻā§āϰ āϝā§āĻ āĻāϰāĻž āĻŦāĻž āϞā§āĻŦā§āϞ āϏāĻāĻā§āϰāĻžāύā§āϤ āϏāĻŽāϏā§āϝāĻžāĻā§āϞāĻŋāϰ āĻŽāϤ⧠āĻāĻŋāĻā§ āϏā§āĻŦāϝāĻŧāĻāĻā§āϰāĻŋāϝāĻŧ āĻāϰāĻžāϰ āĻĒā§āϰāϝāĻŧā§āĻāύ āĻšāϞ⧠āĻā§ āĻšāĻŦā§? āĻāĻāĻžāύā§āĻ GitHub API āĻāĻžāĻā§ āĻāϏā§āĨ¤ āĻāϝāĻŧā§āĻŦāϏāĻžāĻāĻā§ āĻāĻĒāύāĻŋ āϝāĻž āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ āϤāĻžāϰ āĻĒā§āϰāĻžāϝāĻŧ āϏāĻŦ āĻāĻŋāĻā§ āĻāϰāĻžāϰ āĻāύā§āϝ GitHub-āĻāϰ āĻĒā§āϰāĻā§āϰ API āĻāύā§āĻĄāĻĒāϝāĻŧā§āύā§āĻ āϰāϝāĻŧā§āĻā§āĨ¤ āĻāĻ āĻŦāĻŋāĻāĻžāĻā§ āĻāĻŽāϰāĻž āĻļāĻŋāĻāĻŦ āĻāĻŋāĻāĻžāĻŦā§ āĻ āĻĨā§āύā§āĻāĻŋāĻā§āĻ āĻāϰāĻž āϝāĻžāϝāĻŧ āĻāĻŦāĻ API āĻāϰ āϏāĻžāĻĨā§ āϏāĻāϝā§āĻ āĻāϰāĻž āϝāĻžāϝāĻŧ, āĻā§āĻāĻžāĻŦā§ āĻāĻāĻāĻŋ āĻāϏā§āϝā§āϤā§Â āĻāĻŽāĻŋāĻ āĻāϰāϤ⧠āĻšāϝāĻŧ āĻāĻŦāĻ API-āĻāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻāĻāĻāĻŋ āĻĒā§āϞ āϰāĻŋāĻā§ā§ā§āϏā§āĻā§āĻ°Â āĻ āĻŦāϏā§āĻĨāĻž āĻā§āĻāĻžāĻŦā§ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰāϤ⧠āĻšāϝāĻŧāĨ¤āĻŦā§āϏāĻŋāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ
āϏāĻŦāĻā§ā§ā§ āĻŦā§āϏāĻŋāĻ āĻāĻĒāύāĻŋ āϝāĻž āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ, āĻāĻŽāύ āĻāĻāĻāĻŋ GET āϰāĻŋāĻā§ā§ā§āϏā§āĻ āĻĒāĻžāϰāĻĢāϰā§āĻŽ āĻāϰāĻŦā§āύ āϝāĻžāϰ āĻāύā§āϝ⧠āĻā§āύ āĻ āĻĨā§āύā§āĻāĻŋāĻā§āĻļāύ āϞāĻžāĻā§āύāĻžāĨ¤Â āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āĻŦāĻž āĻāĻāĻāĻŋ āĻāĻĒā§āύ āϏā§āϰā§āϏ āĻĒā§āϰāĻāϞā§āĻĒā§ read -only āϤāĻĨā§āϝ āĻšāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āϝāĻĻāĻŋ āĻāĻŽāϰāĻž “schacon” āύāĻžāĻŽā§āϰ āĻāĻāĻāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āϏāĻŽā§āĻĒāϰā§āĻā§ āĻāϰāĻ āĻāĻžāύāϤ⧠āĻāĻžāĻ, āϤāĻžāĻšāϞ⧠āĻāĻŽāϰāĻž āĻāϰāĻāĻŽ āĻāĻŋāĻā§ āĻāĻžāϞāĻžāϤ⧠āĻĒāĻžāϰāĻŋ:
$ curl https://api.github.com/users/schacon
{
"login": "schacon",
"id": 70,
"avatar_url": "https://avatars.githubusercontent.com/u/70",
# ...
"name": "Scott Chacon",
"company": "GitHub",
"following": 19,
"created_at": "2008-01-27T17:19:28Z",
"updated_at": "2014-06-10T02:37:23Z"
}
āĻ āϰāĻāĻžāύāĻžāĻāĻā§āĻļāύ , āĻĒā§āϰāĻā§āĻā§āĻ , āĻāϏā§āϝ⧠, āĻāĻŽāĻŋāĻ āϏāĻŽā§āĻĒāϰā§āĻā§ āϤāĻĨā§āϝ āĻĒāĻžāĻāϝāĻŧāĻžāϰ āĻāύā§āϝ āĻāϰ āĻŽāϤ⧠āĻ āύā§āĻāĻā§āϞāĻŋ āĻāύā§āĻĄāĻĒāϝāĻŧā§āύā§āĻ āϰāϝāĻŧā§āĻā§ â āϝāĻž āĻāĻĒāύāĻŋ GitHub-āĻ āĻĒāĻžāĻŦāϞāĻŋāĻāϞāĻŋ āĻĻā§āĻāϤ⧠āĻĒāĻžāϰā§āύāĨ¤ āĻāĻŽāύāĻāĻŋ āĻāĻĒāύāĻŋ āĻāĻā§āĻāĻžāĻŽāĻ¤Â āĻŽāĻžāϰā§āĻāĻĄāĻžāĻāύ āϰā§āύā§āĻĄāĻžāϰ āĻāϰāϤ⧠āĻŦāĻž āĻāĻāĻāĻŋ .gitignore āĻā§āĻŽāĻĒā§āϞā§āĻ āĻā§āĻāĻā§ āĻĒā§āϤ⧠API āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤
$ curl https://api.github.com/gitignore/templates/Java
{
"name": "Java",
"source": "*.class
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.ear
# virtual machine crash logs, see https://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
"
}
āĻāϏā§āϝā§āϤā§Â āĻāĻŽāĻŋāĻ āĻāϰāĻž
āϝāĻžāĻāĻšā§āĻ, āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻāϝāĻŧā§āĻŦāϏāĻžāĻāĻā§ āĻā§āύ⧠āĻāĻžāĻ āĻāϰāϤ⧠āĻāĻžāύ āϝā§āĻŽāύ āĻā§āύ⧠āĻāϏā§āϝā§āϤ⧠āĻāĻŽāĻŋāĻ āĻāϰāĻž āĻŦāĻž āĻĒā§āϞ āϰāĻŋāĻā§āϝāĻŧā§āϏā§āĻ āĻŦāĻž āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻŦā§āϝāĻā§āϤāĻŋāĻāϤ āĻŦāĻŋāώāϝāĻŧāĻŦāϏā§āϤ⧠āĻĻā§āĻāϤ⧠āĻŦāĻž āĻāύā§āĻāĻžāϰāĻ ā§āϝāĻžāĻā§āĻ āĻāϰāϤ⧠āĻāĻžāύ, āϤāĻžāĻšāϞ⧠āĻāĻĒāύāĻžāĻā§ āĻ āĻĨā§āύā§āĻāĻŋāĻā§āĻ āĻāϰāϤ⧠āĻšāĻŦā§āĨ¤ āĻ āĻĨā§āύā§āĻāĻŋāĻā§āĻļāύā§āϰ āĻŦāĻŋāĻāĻŋāύā§āύ āĻāĻĒāĻžāϝāĻŧ āĻāĻā§āĨ¤ āĻāĻĒāύāĻŋ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻāĻĒāύāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āύāĻžāĻŽ āĻāĻŦāĻ āĻĒāĻžāϏāĻāϝāĻŧāĻžāϰā§āĻĄ āĻĻāĻŋāϝāĻŧā§ āĻŦā§āϏāĻŋāĻ āĻ āĻĨā§āύāĻāĻŋāĻā§āĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ, āϤāĻŦā§ āϏāĻžāϧāĻžāϰāĻŖāϤ āĻŦā§āϝāĻā§āϤāĻŋāĻāϤ āĻ ā§āϝāĻžāĻā§āϏā§āϏ āĻā§āĻā§āύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻāĻžāϞ. āĻāĻĒāύāĻŋ āĻāĻĒāύāĻžāϰ āϏā§āĻāĻŋāĻāϏ āĻĒā§āώā§āĻ āĻžāϰ “Applications” āĻā§āϝāĻžāĻŦ āĻĨā§āĻā§ āĻāĻāĻŋ āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤
$ curl -H "Content-Type: application/json" \
-H "Authorization: token TOKEN" \
--data '{"body":"A new comment, :+1:"}' \
https://api.github.com/repos/schacon/blink/issues/6/comments
{
"id": 58322100,
"html_url": "https://github.com/schacon/blink/issues/6#issuecomment-58322100",
...
"user": {
"login": "tonychacon",
"id": 7874698,
"avatar_url": "https://avatars.githubusercontent.com/u/7874698?v=2",
"type": "User",
},
"created_at": "2014-10-08T07:48:19Z",
"updated_at": "2014-10-08T07:48:19Z",
"body": "A new comment, :+1:"
}

āĻāĻĒāύāĻŋ āĻāϝāĻŧā§āĻŦāϏāĻžāĻāĻā§ āϝāĻž āĻāĻŋāĻā§ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ āϤāĻžāϰ āĻāύā§āϝ āĻāĻĒāύāĻŋ API āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ â āĻŽāĻžāĻāϞāϏā§āĻā§āύ āϤā§āϰāĻŋ āĻāϰāĻž āĻāĻŦāĻ āϏā§āĻ āĻāϰāĻž, āĻāϏā§āϝ⧠āĻāĻŦāĻ āĻĒā§āϞ āϰāĻŋāĻā§āϝāĻŧā§āϏā§āĻā§ āϞā§āĻā§āĻĻā§āϰ āĻāϞā§āĻā§āĻ āĻāϰāĻž, āϞā§āĻŦā§āϞ āϤā§āϰāĻŋ āĻāĻŦāĻ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰāĻž, āĻāĻŽāĻŋāĻ āĻĄā§āĻāĻž āĻ ā§āϝāĻžāĻā§āϏā§āϏ āĻāϰāĻž, āύāϤā§āύ āĻāĻŽāĻŋāĻ āĻāĻŦāĻ āĻļāĻžāĻāĻž āϤā§āϰāĻŋ āĻāϰāĻž, āĻā§āϞāĻž, āĻŦāύā§āϧ āĻāϰāĻž āĻŦāĻž āĻŽāĻžāϰā§āĻ āĻāϰāĻž āĻĒā§āϞ āϰāĻŋāĻā§āϝāĻŧā§āϏā§āĻ, āĻāĻŋāĻŽ āϤā§āϰāĻŋ āĻ āĻāĻĄāĻŋāĻ āĻāϰāĻž, āĻĒā§āϞ āϰāĻŋāĻā§āϝāĻŧā§āϏā§āĻā§ āĻā§āĻĄā§āϰ āϞāĻžāĻāύ⧠āĻāĻŽāĻŋāĻ āĻāϰāĻž, āϏāĻžāĻāĻ āϏāĻžāϰā§āĻ āĻāϰāĻž āĻāĻŦāĻ āĻāϰ⧠āĻ āύā§āĻ āĻāĻžāĻ āĨ¤
āĻĒā§āϞ āϰāĻŋāĻā§ā§ā§āϏā§āĻā§āϰ āϏā§āĻā§āϝāĻžāĻāĻžāϏ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ
āĻāĻŽāϰāĻž āĻāĻāĻāĻŋ āĻļā§āĻˇÂ āĻāĻĻāĻžāĻšāϰāĻŖ āĻĻā§āĻāĻŦ āĻāĻžāϰāĻŖ āĻāĻāĻŋ āϏāϤā§āϝāĻŋāĻ āĻĻāϰāĻāĻžāϰ⧠āϝāĻĻāĻŋ āĻāĻĒāύāĻŋ āĻĒā§āϞ āϰāĻŋāĻā§ā§ā§āϏā§āĻāĻā§āϞāĻŋāϰ āϏāĻžāĻĨā§ āĻāĻžāĻ āĻāϰā§āύāĨ¤ āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻāĻŽāĻŋāĻ āĻāϰ āϏāĻžāĻĨā§ āϝā§āĻā§āϤ āĻāĻ āĻŦāĻž āĻāĻāĻžāϧāĻŋāĻ āϏā§āĻā§āϝāĻžāĻāĻžāϏ āĻĨāĻžāĻāϤ⧠āĻĒāĻžāϰ⧠āĻāĻŦāĻ āϏā§āĻ āϏā§āĻā§āϝāĻžāĻāĻžāϏ āϝā§āĻ āĻāϰāϤ⧠āĻāĻŦāĻ āĻā§ā§ā§āϰāĻŋ (query) āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ API āĻāĻā§āĨ¤
āĻŦā§āĻļāĻŋāϰāĻāĻžāĻ āĻāύā§āĻāĻŋāύāĻŋāĻā§āĻžāϏ āĻāύā§āĻāĻŋāĻā§āϰā§āĻļāύ āĻāĻŦāĻ āĻā§āϏā§āĻāĻŋāĻ āϏāĻžāϰā§āĻāĻŋāϏāĻā§āϞāĻŋ āĻāĻ API āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻĒā§āĻļ āĻĻā§āĻāϝāĻŧāĻž āĻā§āĻĄāĻāĻŋ āĻĒāϰā§āĻā§āώāĻž āĻāϰ⧠āĻĒā§āĻļā§āϰ āĻĒā§āϰāϤāĻŋ āĻĒā§āϰāϤāĻŋāĻā§āϰāĻŋāϝāĻŧāĻž āĻāĻžāύāĻžāϤ⧠āĻāĻŦāĻ āϤāĻžāϰāĻĒāϰ⧠āϰāĻŋāĻĒā§āϰā§āĻāĻāĻŋāϰ āϏāĻŽāϏā§āϤ āĻā§āϰāĻžāĻāĻā§āϰāĻŋā§āĻž āϝāĻĻāĻŋ āĻ āĻŋāĻ āĻĨāĻžāĻā§ āϤāĻžāĻšāϞ⧠āϰāĻŋāĻĒā§āϰā§āĻ āĻāϰā§ā§ˇ āĻāĻĒāύāĻŋ āĻāĻŽāĻŋāĻ āĻŽā§āϏā§āĻāĻāĻŋ āϏāĻ āĻŋāĻāĻāĻžāĻŦā§ āĻĢāϰā§āĻŽā§āϝāĻžāĻ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§ āĻāĻŋāύāĻž āϤāĻž āĻĒāϰā§āĻā§āώāĻž āĻāϰāϤā§āĻ āĻāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤Â
āϧāϰāĻž āϝāĻžāĻ āĻāĻĒāύāĻŋ āĻāĻĒāύāĻžāϰ āϰāĻŋāĻĒā§āĻāĻŋāĻāϰāĻŋāϤ⧠āĻāĻāĻāĻŋ āĻāϝāĻŧā§āĻŦāĻšā§āĻ āϏā§āĻ āĻāĻĒ āĻāϰā§āĻā§āύ āϝāĻž āĻāĻāĻāĻŋ āĻā§āĻ āĻāϝāĻŧā§āĻŦ āϏāĻžāϰā§āĻāĻŋāϏāĻā§ āĻšāĻŋāĻ āĻāϰ⧠Signed-off-by āϝāĻž āĻāĻŽāĻŋāĻ āĻŽā§āϏā§āĻā§ āĻāĻāĻāĻŋ āϏā§āĻā§āϰāĻŋāĻ āĻĒāϰā§āĻā§āώāĻž āĻāϰā§āĨ¤
require 'httparty'
require 'sinatra'
require 'json'
post '/payload' do
push = JSON.parse(request.body.read) # parse the JSON
repo_name = push['repository']['full_name']
# look through each commit message
push["commits"].each do |commit|
# look for a Signed-off-by string
if /Signed-off-by/.match commit['message']
state = 'success'
description = 'Successfully signed off!'
else
state = 'failure'
description = 'No signoff found.'
end
# post status to GitHub
sha = commit["id"]
status_url = "https://api.github.com/repos/#{repo_name}/statuses/#{sha}"
status = {
"state" => state,
"description" => description,
"target_url" => "http://example.com/how-to-signoff",
"context" => "validate/signoff"
}
HTTParty.post(status_url,
:body => status.to_json,
:headers => {
'Content-Type' => 'application/json',
'User-Agent' => 'tonychacon/signoff',
'Authorization' => "token #{ENV['TOKEN']}" }
)
end
end

āĻāĻĒāύāĻŋ āĻāĻāύ āĻāĻŽāĻŋāĻā§āϰ āĻĒāĻžāĻļā§ āĻāĻāĻāĻŋ āĻā§āĻ āϏāĻŦā§āĻ āĻā§āĻ āĻāĻŋāĻšā§āύ āĻĻā§āĻāϤ⧠āĻĒāĻžāĻŦā§āύ āϝā§āĻāĻŋāϤ⧠āĻŦāĻžāϰā§āϤāĻžāĻāĻŋāϤ⧠āĻāĻāĻāĻŋ “Signed-off-by” āϏā§āĻā§āϰāĻŋāĻ āϰāϝāĻŧā§āĻā§ āĻāĻŦāĻ āϝā§āĻāĻžāύ⧠āϞā§āĻāĻ āϏāĻžāĻāύ āĻ āĻĢ āĻāϰāϤ⧠āĻā§āϞ⧠āĻā§āĻā§āύ āϤāĻžāϰ āĻŽāϧā§āϝ āĻĻāĻŋāϝāĻŧā§ āĻāĻāĻāĻŋ āϞāĻžāϞ āĻā§āϰāϏ āϰāϝāĻŧā§āĻā§ā§ˇ āĻāĻĒāύāĻŋ āĻāϰāĻ āĻĻā§āĻāϤ⧠āĻĒāĻžāϰā§āύ āϝ⧠āĻĒā§āϞ āϰāĻŋāĻā§ā§ā§āϏā§āĻ āĻļāĻžāĻāĻžāϝāĻŧ āĻļā§āώ āĻāĻŽāĻŋāĻā§āϰ āϏā§āĻā§āĻā§Â āύā§āϝāĻŧ āĻāĻŦāĻ āĻāĻāĻŋ āĻŦā§āϝāϰā§āĻĨ āĻšāϞ⧠āĻāĻĒāύāĻžāĻā§ āϏāϤāϰā§āĻ āĻāϰā§āĨ¤ āĻāĻāĻŋ āϏāϤā§āϝāĻŋāĻ āĻĻāϰāĻāĻžāϰ⧠āϝāĻĻāĻŋ āĻāĻĒāύāĻŋ āĻĒāϰā§āĻā§āώāĻžāϰ āĻĢāϞāĻžāĻĢāϞā§āϰ āĻāύā§āϝ āĻāĻ API āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻā§āύ āϝāĻžāϤ⧠āĻāĻĒāύāĻŋ āĻĻā§āϰā§āĻāĻāύāĻžāĻā§āϰāĻŽā§ āĻāĻŽāύ āĻāĻŋāĻā§ āĻŽāĻžāϰā§āĻ āĻāϰāĻŦā§āύ āύāĻž āϝā§āĻāĻžāύ⧠āĻļā§āώ āĻāĻŽāĻŋāĻ āĻā§āϏā§āĻ āĻĢā§āĻāϞ āĻāϰā§āĨ¤
āĻ āĻā§āĻā§āĻāĻŋāĻ
āϝāĻĻāĻŋāĻ āĻāĻŽāϰāĻž āĻāĻ āĻāĻĻāĻžāĻšāϰāĻŖāĻā§āϞāĻŋāϤ⧠āĻāĻŦāĻ āϏāĻžāϧāĻžāϰāĻŖ HTTP āϰāĻŋāĻā§ā§ā§āώā§āĻāĻā§āϞāĻŋāϰ āĻĒā§āϰāĻžāϝāĻŧ āϏāĻŦāĻāĻŋāĻā§āĻ curl āĻĻāĻŋā§ā§ āĻāϰāĻāĻŋ , āĻŦā§āĻļ āĻāϝāĻŧā§āĻāĻāĻŋ āĻāĻĒā§āύ-āϏā§āϰā§āϏ āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ āĻāĻā§ āϝāĻž āĻāĻ API āĻāĻŋāĻā§ āĻāϰāĻ āϏāĻžāĻā§āĻāύā§āĻĻā§ āĻŦā§āϝāĻŦāĻšāĻžāĻ°Â āĻāϰā§āĨ¤ āĻāĻ āϞā§āĻāĻž āϞā§āĻāĻžāϰ āϏāĻŽāϝāĻŧ, āϏāĻŽāϰā§āĻĨāĻŋāϤ āĻāĻžāώāĻžāĻā§āϞāĻŋāϰ āĻŽāϧā§āϝ⧠āϰāϝāĻŧā§āĻā§ Go, Objective-C, Ruby āĻāĻŦāĻ .NETāĨ¤ āĻāĻā§āϞāĻŋ āϏāĻŽā§āĻĒāϰā§āĻā§ āĻāϰāĻ āϤāĻĨā§āϝā§āϰ āĻāύā§āϝ https://github.com/octokit āĻĻā§āĻā§āύ , āĻāĻžāϰāĻŖ āϤāĻžāϰāĻž āĻāĻĒāύāĻžāϰ āĻāύā§āϝ āĻŦā§āĻļāĻŋāϰāĻāĻžāĻ HTTP āĻĒāϰāĻŋāĻāĻžāϞāύāĻž āĻāϰā§āĨ¤
āĻāĻļāĻž āĻāϰāĻŋ āĻāĻ āĻā§āϞāĻā§āϞāĻŋ āĻāĻĒāύāĻžāĻā§ āĻāĻĒāύāĻžāϰ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻāϝāĻŧāĻžāϰā§āĻāĻĢā§āϞā§āĻā§āϞāĻŋāϰ āĻāύā§āϝ āĻāϰāĻ āĻāĻžāϞ āĻāĻžāĻ āĻāϰāϤ⧠āĻāĻŋāĻāĻšāĻžāĻŦāĻā§ āĻāĻžāϏā§āĻāĻŽāĻžāĻāĻ āĻāĻŦāĻ āϏāĻāĻļā§āϧāύ āĻāϰāϤ⧠āϏāĻšāĻžāϝāĻŧāϤāĻž āĻāϰāĻŦā§āĨ¤ āϏāĻŽā§āĻĒā§āϰā§āĻŖ API-āĻ āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻĄāĻā§āĻŽā§āύā§āĻā§āĻļāύā§āϰ āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ āϏāĻžāϧāĻžāϰāĻŖ āĻāĻžāĻā§āϰ āĻāύā§āϝ āĻāĻžāĻāĻĄā§āϰ āĻāύā§āϝ, https://developer.github.com āĻĻā§āĻā§āύ āĨ¤