你如何从博客文章中将图片附加到LinkedIn分享?

时间:2016-03-26 04:53:15

标签: javascript jquery html angularjs linkedin-api

我有一个博客,我想通过LinkedIn分享。 LinkedIn提供的文档,虽然简单说明没有足够的细节让我理解我的用例。我的用例要求我动态地将图片和描述放在每篇博文中,而这篇博文目前尚未填充。这是一个Angular项目。

我目前的代码: 的 post.html

<script>
  delete IN;
  $.getScript("https://platform.linkedin.com/in.js");
</script>
<script type="IN/Share" data-url={{webAddress}} data-counter="right"></script>

post.js //我在此区域的$ scope变量中包含了所有数据,其中包括 //图片和说明我想附在帖子上。

以下是LinkedIn文档显示的正确方法: 的 post.html

<script type="text/javascript" src="//platform.linkedin.com/in.js">
  api_key: YOUR_API_KEY_HERE
  authorize: true
  onLoad: onLinkedInLoad
</script>

<script type="text/javascript">

  // Setup an event listener to make an API call once auth is complete
    function onLinkedInLoad() {
      IN.Event.on(IN, "auth", shareContent);
    }

  // Handle the successful return from the API call
  function onSuccess(data) {
    console.log(data);
  }

  // Handle an error response from the API call
  function onError(error) {
    console.log(error);
  }

  // Use the API call wrapper to share content on LinkedIn
  function shareContent() {

    // Build the JSON payload containing the content to be shared
    var payload = { 
      "comment": "Check out developer.linkedin.com! http://linkd.in/1FC2PyG", 
      "visibility": { 
        "code": "anyone"
      } 
    };

    IN.API.Raw("/people/~/shares?format=json")
      .method("POST")
      .body(JSON.stringify(payload))
      .result(onSuccess)
      .error(onError);
  }

</script>

据我了解,我需要使用正确的数据/链接填充有效负载对象。根据{{​​3}}中的内容,我不知道如何做到这一点。

以下是我尝试/想过的一些事情,以及我目前所处的位置:

1)从post.js获取数据并将其放在post.html中脚本标记之间的有效负载对象中。做了一些研究之后,就不可能做到这一点。如果我错了,我欢迎被纠正。

2)将IN对象置于角度并填充post.js中的有效负载。这听起来真的很棒,但LinkedIn没有提供用于在带有Angular的post.js中调用函数的html。此外,所提供的LinkedIn代码负责按钮的格式化以及点击后的内容。

3)使用JQuery在脚本标记内进行http调用。我很少使用JQuery,之前从未使用过http的JQuery。如果这是一个可行的方法来思考这个问题,这就是我提出的:

<script type="IN/Share" data-url={{webAddress}} data-counter="right">
                  $.get( "https://public-api.wordpress.com/rest/v1.1/sites/myPost", function( response ) {
                    var post = _.first(_.filter(response.posts, function(n){return n.title.replace(/ /g,"-").replace(/[:]/g, "").toLowerCase() === $stateParams.id}));
                    var post1 = _.assign(post, {category: _.first(_.keys(post.categories)), pic: _.first(_.values(post.attachments)).URL, credit: _.first(_.values(post.attachments)).caption, linkCredit: _.first(_.values(post.attachments)).alt, fullStory: post.content.replace(/<(?!\s*\/?\s*p\b)[^>]*>/gi,'')});
                    **var image = post1.pic;**
                    **var title = post1.title;**
                    **var webAddress = window.location.href;**

                    function onLinkedInLoad() {
                      IN.Event.on(IN, "auth", shareContent);
                    }

                   function onSuccess(data) {
                    console.log(data);
                   }

                   function onError(error) {
                    console.log(error);
                   }

                   function shareContent(title, image, webAddress) {

                    var payload = {                         
                      "content": {
                        "title": title,
                        "submitted-image-url": image,
                        "submitted-url": webAddress
                      }
                    };

                    IN.API.Raw("/people/~/shares?format=json")
                      .method("POST")
                      .body(JSON.stringify(payload))
                      .result(onSuccess)
                      .error(onError);
                   }
                  });

                  </script>

此解决方案也未导致解决方案。从这里开始,我没有任何想法。我确信这很简单但又特殊,我需要一点点握手。

1 个答案:

答案 0 :(得分:1)

不幸的是,我没有使用linkedin API

在我的例子中,也许并非一切都是正确的。但是我必须在IN中使用变量angular并写一下调用API包装器。

使用插件的示例,请参阅第LinkedIn Plugins页。

jsfiddle上的实例。

  //CallBackHell
  function LinkedInServiceFunc(callback) {
    callback && IN.Event.onDOMReady(callback);
  }

  angular.module('ExampleApp', [])
    .controller('ExampleController', function($scope, LinkedInService, ShareLinkedINService) {
      console.log('ExampleController IN', IN);
      console.log('ExampleController LinkedInService', LinkedInService);
      LinkedInService.promise.then(function(LIN) {
        console.log('Complete loading script for LinkedIn in ExampleController', LIN.Objects)
      });

      //Then you can interact with IN object as angular service. Like this
      $scope.shareContent = function() { // Use the API call wrapper to share content on LinkedIn

        // Build the JSON payload containing the content to be shared
        var payload = {
          "comment": $scope.comment,
          "visibility": {
            "code": 'anyone'
          }
        };
        // Handle the successful return from the API call
        function onSuccess(data) {
          console.log(data);
        }

        // Handle an error response from the API call
        function onError(error) {
          console.log(error);
        }
        console.log('shareContent', payload);
        LinkedInService.promise.then(function(LIN) {
          LIN.API.Raw("/people/~/shares?format=json")
            .method("POST")
            .body(JSON.stringify(payload))
            .result(onSuccess)
            .error(onError);
        });
      }
      $scope.shareContentService = function() {
        //It's better way, i think
        ShareLinkedINService.shareContent($scope.comment, 'anyone').then(function(data) {
          console.log('success', data);
        }).catch(function(data) {
          console.err('error', data);
        });
      }
    })
    .service('LinkedInService', function($q) {
      var defer = $q.defer();
      LinkedInServiceFunc(function() {
        defer.resolve(IN);
      });
      return {
        promise: defer.promise
      };
    })
    //You can create wrapper on IN API
    .service('ShareLinkedINService', function(LinkedInService, $q) {
      return {
        shareContent: function(comment, visible) {
          var defer = $q.defer();
          var payload = {
            "comment": comment,
            "visibility": {
              "code": visible
            }
          };
          LinkedInService.promise.then(function(LIN) {
            LIN.API.Raw("/people/~/shares?format=json")
              .method("POST")
              .body(JSON.stringify(payload))
              .result(defer.resolve)
              .error(defer.reject);
          });
          return defer.promise;

        }
      }
    })
    .directive('linkedInShareButton', function(LinkedInService) {
      return {
        restrict: "E",
        replace: false,
        scope: {
          shareUrl: "@",
          counter:"@"
        },
        link: function(scope, elem, attr) {
          var script = document.createElement('script');
          script.setAttribute('type', 'IN/Share');
          script.setAttribute('data-url', scope.shareUrl);
          script.setAttribute('data-counter', scope.counter);
          elem.append(script);
        },
      };
    });
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
<script type="text/javascript" src="//platform.linkedin.com/in.js">
  authorize: false
  onLoad: LinkedInServiceFunc
    //I don't have api_key, because i delete it
    // api_key: YOUR_API_KEY_HERE
    // authorize: true
    // onLoad: onLinkedInLoad
</script>

<body ng-app="ExampleApp">
  <div>
    <div ng-controller="ExampleController">
      <input ng-model="comment">
      <button ng-click="shareContent()">
        shareContent
      </button>
      <button ng-click="shareContentService()">
        shareContentService
      </button>
      <script type="IN/Share" data-url="www.mail.ru" data-counter="top"></script>
      <linked-in-share-button share-url="www.mail.ru" counter="top"></linked-in-share-button>
    </div>
  </div>
</body>

相关问题